#vertica
#vertica
Вопрос:
Дана таблица A со столбцом (A1, A2, A3 …) и таблица B со столбцом (B1, B2, A1), где A1 — внешний ключ для поля A1 в таблице A.
Таблица A содержит записи, на которые ссылается B.
Таблицы разделяются полем даты, и это поле имеет одинаковое значение для связанных записей в таблицах A и B.
Если удаляется раздел, содержащий строку в A, на которую ссылается B , почему я не получаю исключение? Я бы ожидал какой-то ошибки, указывающей на то, что на запись где-то ссылаются.
Или я что-то упускаю — должно ли это меня предупреждать?
Ответ №1:
До версии 8 Vertica не может применять ограничения первичного, уникального или внешнего ключа во время операций dml. Вам придется обнаруживать нарушение после факта использования analyze_constraints()
.
Даже версия 8 имеет ограничения в этом отношении. Во-первых, вы должны убедиться, что проверка включена. Во-вторых, это работает только для первичных и уникальных ключей.
Чтобы применить FK (в любой версии), вы должны создать проекцию предварительного соединения. Однако даже выполнение этого не может быть вашим ответом, потому что вы не можете удалять разделы, когда есть проекция предварительного соединения (вам придется удалить проекцию предварительного соединения, удалить разделы, воссоздать проекцию предварительного соединения).
Также существуют некоторые другие ограничения на использование проекций предварительного соединения.
Я также упомяну, что Vertica не является OLTP, она ориентирована на быструю загрузку и быстрые запросы (и сжатие). Я понимаю вашу боль, хотя иногда мне нужна такая функциональность.
Надеюсь, это поможет.