Целостность данных MySQL? - PullRequest
1 голос
/ 14 мая 2010

В различных сравнениях PostgreSQL и MySQL я видел много упоминаний о проблемах с целостностью данных в MySQL. Это все еще проблема?

Специально для веб-приложений, использующих MySQL, существуют ли хитрости для обеспечения целостности данных? Или с новыми версиями это правда «из коробки» без дополнительной настройки требуется?

Ответы [ 3 ]

3 голосов
/ 14 мая 2010

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

По умолчанию MySQL принимает недопустимые данные, такие как дата '2010-02-30', молча обрезает слишком длинные текстовые данные, слишком большие числа и т. Д. Но вы можете изменить это для таблиц INNODB, используя SET sql_mode = 'STRICT_TRANS_TABLES'; в mysql 5.0.2 и вверх - см. «Ограничения на неверные данные» .

MySQL вообще не поддерживает проверочные ограничения, поэтому вы не можете, например:

  • заставить целочисленные данные быть в некотором диапазон;
  • заставить текстовые данные иметь какой-либо формат (например, действительный адрес электронной почты) адрес или действительный URL);
  • ограничить текстовые данные допустимыми символами (только ASCII, только ISO-8859-1, только цифры и минус и т. д.);
  • Запрещать пробелы, переводы строки, двойные пробелы, пробелы в конце и т. Д. или пустые текстовые данные.

Таким образом, вся проверка данных должна выполняться в клиентском приложении. Что труднее сделать и более подвержено ошибкам.

Все это не проблема в PostgreSQL.

3 голосов
/ 14 мая 2010

MySQL имеет функцию поддержки нескольких бэкэндов хранилища (механизм хранения). Самые известные из них - MyISAM и InnoDB. MyISAM используется по умолчанию, во многих ситуациях довольно быстро, но не обеспечивает целостности данных. InnoDB поддерживает полную целостность данных. При создании таблицы вы можете установить тип.

CREATE TABLE foo (...) ENGINE=innodb;

Подробнее см. http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html.

0 голосов
/ 14 мая 2010

Никакой механизм хранения для MySQL не поддерживает ограничения CHECK. Нуфф сказал.

"Для других механизмов хранения предложения анализируются, но игнорируются. Предложение CHECK анализируется, но игнорируются всеми механизмами хранения." «Причиной принятия, но игнорирования синтаксических предложений является совместимость, упрощение переноса кода с других серверов SQL и запуск приложений, создающих таблицы со ссылками» - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html В MySQL 5.4 нет улучшений для этого или 5.5 согласно инструкции.

Обратите внимание, что InnoDB поддерживает ИНОСТРАННЫЕ КЛЮЧИ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...