В системе MySQL предусмотрен определенный механизм ограничений первичных и внешних ключей в целях поддержки целостности данных. Столбцы могут быть объявлены таким образом, чтобы сделать ввод значений NULL недопустимым. Для предотвращения появления незаполненных столбцов, MySQL поддерживает использование значений по умолчанию, которые совместно со свойствами NOT NULL обеспечивают ввод в столбец только допустимых данных, в противном случае столбец останется пустым.
Транзакции
До недавнего времени MySQL не имел возможностей по обработке транзакций, однако, начиная с версии 3.23, у MySQL появились такие дескрипторы, как InnoDB и BDB, которые имеют возможность работы с транзакциями, аналогично коммерческим реляционным СУБД.
Считается, что СУБД может работать с транзакциями, если она соответствует условиям теста, известного как ACID-тест. Удовлетворяющая ACID-тесту база данных должна иметь следующие характеристики:
■ атомарность (A);
■ целостность (C);
■ изолированность (I);
■ надежность (D).
Рассмотрим все эти характеристики детальнее. Скоро
В то время как будущие версии MySQL должны иметь внешние ключи во всех типах таблиц, эта составляющая ссылочной целостности сейчас предусмотрена только в таблицах типа InnoDB.

Атомарность
По определению транзакцией называется операция или последовательность операций, которые позволяют осуществить доступ к данным базы данных или их изменение. Согласно терминологии языка SQL, транзакция возникает, когда один или несколько операторов SQL работают единым блоком. Каждый оператор SQL в таком блоке зависит от других операторов; другими словами, если один из операторов из блока по какой-то причине выполнен не будет, будет сделан "откат" всех операторов и все данные возвращаются в состояние, которое они имели перед началом транзакции. Группировка операторов SQL как части единого блока (или транзакции) сообщает MySQL о том, что весь блок должен выполняться атомарно.
Атомарное выполнение представляет собой дилемму "все или ничего". Все операторы SQL должны выполняться для того, чтобы база данных сохраняла целостность данных; в противном случае выполнение ни одного из операторов, принадлежащих блоку, завершено не будет. В СУБД MySQL начало блока обозначается оператором BEGIN. Транзакция (или рабочий блок) не будет помечена как выполненная до тех пор, пока не будет выполнен оператор COMMIT, по которой MySQL завершает действие. При необходимости оператор ROLLBACK инициирует откат всех изменений данных в состояние, которое они имели до выполнения оператора BEGIN.
Например, при дебитовании и кредитовании вашего банковского счета, банк добавляет и вычитает деньги со счета одной транзакцией. В эти модификации обычно вовлечено несколько таблиц. Таким образом, банк не в состоянии поддерживать целостность данных, не гарантируя выполнения всей транзакции, а не только ее части.
Управление транзакциями очень важно для систем клиент/сервер, выполняющих ввод данных, или для любого приложения, которое должно рассчитывать на хорошую защиту от неопределенной потери данных, как это было в примере с банком, описанном выше.
Целостность
Можно сказать, что целостность достигнута, если после каждой транзакции система остается в целостном состоянии, независимо от успешности выполнения транзакции.
Предположим, например, что ваш банк выполняет транзакцию по переводу денег с одного банковского счета на другой. Эта транзакция вычитает определенную денежную сумму с одного банковского счета, но ей не удается прибавить эту же сумму на другом счете, на который переводится данная денежная сумма. Это значит, что с этого момента система больше не будет находиться в целостном состоянии. В таком случае эта транзакция нарушает ограничения, обеспечивающие целостность, и система больше не соответствует требованиям ACID-теста.
В СУБД MySQL целостность поддерживается прежде всего механизмами регистрации MySQL, которые записывают все изменения, происходящие в базе данных, обеспечивая протоколирование и восстановлении транзакций. Когда система отключается посредине выполнения транзакции, процесс восстановления MySQL использует эти журналы для определения успешности завершения транзакции и при необходимости делает откат.
В дополнение к процессу протоколирования, в MySQL предусмотрены механизмы блокировки, обеспечивающие блокировку всех таблиц, строк и индексов, участвующих в транзакции вне зависимости от того, будут ли они выполнены успешно или будет сделан откат.