Mysql каскад при обновлении / удалении пустого поля

0

У меня есть таблица с двумя полями, одна с нулевым значением и одна не-нулевая. Эти поля представляют собой составной уникальный ключ на этой таблице

CREATE TABLE 'sections' (
  'product_id' varchar(255) NULL DEFAULT NULL,
  'id' varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE 'sections' 
   ADD UNIQUE KEY ('product_id', 'id');

У меня есть другая таблица с ограничением внешнего ключа в полях уникальных ключей первой таблицы

CREATE TABLE 'sections_t' (
  'product_id' varchar(255) NULL DEFAULT NULL,
  'section_id' varchar(255) NOT NULL,
  'name' varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE 'sections_t'
  ADD CONSTRAINT 'sections_t_ibfk_1' FOREIGN KEY ('product_id', 'section_id') REFERENCES 'sections' ('product_id', 'id') ON DELETE CASCADE ON UPDATE CASCADE;

Кажется, что все работает нормально, когда я обновляю/удаляю записи в таблице sections которых product_id не product_id нулю. Но когда я обновляю/удаляю запись с product_id null, это изменение не каскадируется в sections_t.

Как я могу каскадировать изменения, включающие записи с нулевыми полями?

Теги:
foreign-keys
nullable
cascade

1 ответ

0

У вас не должно быть FK (внешний ключ), ссылающихся на поля с нулевым значением. Это не стандартный SQL & MySQL позволяет вам делать это с помощью InnoDB, но не говорит:

Обработка ссылок на внешние ключи к неединственным ключам или ключам, которые содержат значения NULL, недостаточно точно для операций, таких как UPDATE или DELETE CASCADE. Вам рекомендуется использовать внешние ключи, которые ссылаются только на ключи, которые являются UNIQUE (или PRIMARY) и NOT NULL.

Но SQL действительно не предназначен для поддержки сослов с NULL в качестве идентификаторов:

Понимаете ли вы, что соответствие FK в стандартном и обычном режиме, обычно только реализованном (в том числе в MySQL), заключается в том, что если какой-либо столбец FK равен NULL, то ограничение FK считается выполненным независимо от того, что находится в ссылочной таблице? (И что ни в каком режиме значение столбца NULL FK не соответствует чему-либо в ссылочной таблице?) Итак, даже если вы используете функцию MySQL, вы никогда не получите соответствие FK формы (x, NULL)?

(Вы понимаете, что в духе SQL NULL <> NULL, если FK-подрыв с NULL должен был иметь равный в своей ссылочной таблице, тогда он никогда не будет, потому что ничто в ссылочной таблице не может равняться NULL в любом случае, даже НОЛЬ?)

Вы понимаете, что определение UNIQUE индекса без NULL позволяет любое количество строк формы (p, NULL) в таблице? (Он только "уникален" в извращенной форме SQL 3VL). И что же такое UNIQUE с нулевым столбцом, действительно захватывающим ограничение, которое вы хотите в своей ссылочной таблице?

Понимаете ли вы, что запрос будет сложным, потому что если вы хотите вручную (x, NULL) пары, входящие в пары (x, не-NULL), вы должны писать такие вещи, как OR id IS NULL?

Если вам нужны эти таблицы, вам придется писать триггеры для ограничений и каскадирования. Но вы должны использовать дизайн, который использует NULL так, как SQL ожидает & поддерживает. Это, вероятно, также будет включать некоторые триггеры, но вы, скорее всего, сможете использовать некоторые декларативные ограничения и каскадирование, и ваш дизайн не будет нестандартным и контр-интуитивным с точки зрения использования SQL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню