2015-06-01 3 views
0

У меня есть неэлементный внешний ключ, который мне нужно установить по умолчанию при удалении из другой таблицы. Я использую MariaDB и экспортирую скрипт SQL из модели в MySQL Workbench.MariaDB, Workbench и ON DELETE SET DEFAULT

MariaDB поддерживает ON DELETE SET DEFAULT в соответствии с https://mariadb.com/kb/en/sql-99/constraint_type-foreign-key-constraint/ В документации по MySQL говорится, что, хотя он «разрешен сервером MySQL, он отклоняется как недопустимый InnoDB».

Итак, у меня есть два вопроса: могу ли я быть уверен, что механизм хранения по умолчанию на MariaDB действительно поддерживает его (или ссылка на документацию выше означает только, что сервер сам ее поддерживает), и, если предположить, как это сделать вокруг вопроса о Workbench, не позволяющем мне установить этот проклятый вариант?

ответ

1

Итак, вопрос действительно два вопроса.

Поддерживает ли MariaDB ON DELETE SET DEFAULT. Да. Но, тем более важным вопросом является действительно

Есть ли у MariaDB устройства хранения данных, поддерживающие ON DELETE SET DEFAULT?


Я считаю, что MariaDB принимает синтаксис (на уровне сервера). Но когда сервер переходит к базовому механизму хранения, механизм хранения будет отклоняться и отклонять его.

Например, это может привести к передаче данных в таблицы с использованием механизма хранения MyISAM. (Я не уверен в этом, мы никогда не определяем внешние ключи в таблицах MyISAM.) Если он будет передан в MyISAM, было бы натянуто сказать «он работает», потому что ничего «внешнего ключа» фактически не работает с MyISAM. MyISAM эффективно игнорирует ограничения внешнего ключа.

Я думаю, что есть примечание в документации, на которую вы ссылались, что у MariaDB был механизм хранения с именем PBXT, который принял бы это. Но разработка PBXT прекратилась, и она отключена в MariaDB 5.5. Чтобы включить механизм хранения, вам нужно будет сделать сборку MariaDB с включенным. Но это целая фраза, просто сказать: «MariaDB поддерживает ON DELETE SET DEFAULT».

Механизм хранения InnoDB не поддерживает его. И XtraDB - улучшенный InnoDB, но я не думаю, что это область, которую они улучшили. (Стоит быстрая проверка, если вы используете XtraDB.)

Если вы используете движок хранения InnoDB для своей таблицы, то ответ заключается в том, что MariaDB не поддерживает ON DELETE SET DEFAULT.

Если вы используете какой-либо другой механизм хранения, возможно. Но я думаю, что единственным механизмом хранения в MariaDB, который поддерживал его, была PBXT.


Ссылка: https://mariadb.com/kb/en/mariadb/foreign-keys/

Допустимые действия для ON DELETE и ON UPDATE являются:

SET DEFAULT: только работал с PBXT. Подобно SET NULL, но для столбцов внешнего ключа были установлены значения по умолчанию. Если значения по умолчанию не существуют, возникает ошибка.


Обходной, конечно, не полагаться на FOREIGN KEY правило ограничения, чтобы сделать это для вас. Просто установите для правила значение ON DELETE RESTRICT.

Перед удалением строк из родительской таблицы вы можете выполнить обновление ссылок на строки в дочерней таблице, и вы можете установить столбец внешнего ключа в этих строках на любое допустимое значение, которое вы хотите. Затем вы можете удалить строки из родителя.

+0

Спасибо за подробный ответ. –