2015-06-04 3 views
2

проверочное ограничение не будет работатьпроверочное ограничение не будет работать MySQL

CREATE TABLE IF NOT EXISTS supervisor (
sup_id INT(3) NOT NULL, 
sup_name VARCHAR(30) NOT NULL, 
gen VARCHAR(1) NOT NULL CHECK (gen='M' or gen='F'), 
dep_id INT(4), 

PRIMARY KEY (sup_id), 
INDEX (dep_id), 

FOREIGN KEY (dep_id) 
    REFERENCES department(dep_id) 
    ON UPDATE CASCADE ON DELETE RESTRICT  
); 

я также пытался:

CONSTRAINT chk_supervisor_gen CHECK ('M' or 'F') 

ни один из них остановил эту информацию вводимой

INSERT 
INTO supervisor (sup_id, sup_name, gen, dep_id) 
VALUES 
     (1, 'hello', 'G', 1); 
+5

Насколько я знаю MySQL не поддерживает 'CHECK' ограничений. Предложение 'CHECK' анализируется *, но * игнорируется * всеми механизмами хранения *. –

+0

из справочного центра StackOverflow: [** Что делать, если кто-то отвечает на мой вопрос? ** http://stackoverflow.com/help/someone-answers](http://stackoverflow.com/help/someone-answers). – spencer7593

ответ

0

К сожалению, MySQL не поддерживает ограничения проверки SQL. Так попробуйте использовать enum вместо

CREATE TABLE IF NOT EXISTS supervisor (
sup_id INT(3) NOT NULL, 
sup_name VARCHAR(30) NOT NULL, 
gen enum('M','F') NOT NULL, 
dep_id INT(4), 

PRIMARY KEY (sup_id), 
INDEX (dep_id), 

FOREIGN KEY (dep_id) 
    REFERENCES department(dep_id) 
    ON UPDATE CASCADE ON DELETE RESTRICT  
); 
+0

мы должны использовать контрольное ограничение. Я хотел бы сделать это так: P –

+1

http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-is-not-working. К сожалению, MySQL не поддерживает ограничения проверки SQL –

3

MySQL не обеспечивает проверочных ограничений.

Это хорошо документированное отклонение от стандарта SQL. (Хотя это неожиданно для непосвященных.)

Если вам нужна база данных MySQL для принудительного применения «контрольного ограничения», принудительное исполнение должно быть закодировано в BEFORE INSERT и триггер BEFORE UPDATE.


Это примечание:

Предложение CHECK анализируется, но игнорируется всеми механизмами хранения.

похоронен в Справочном руководстве по MySQL под синтаксисом CREATE TABLE.

Ссылка: https://dev.mysql.com/doc/refman/5.5/en/create-table.html


ПРЕДУПРЕЖДЕНИЕ О ENUM

ENUM не ограничивает "недействительные" значения из вставляется; неверное значение преобразуется в строку нулевой длины, выдается предупреждение, но это не ошибка.

Демонстрация:

CREATE TABLE foo (gen ENUM('M','F')) 

INSERT INTO foo (gen) VALUES ('x') 

-- Warning Code : 1265 
-- Data truncated for column 'gen' at row 1 

SELECT gen, CHAR_LENGTH(gen) FROM foo; 

-- gen CHAR_LENGTH(gen) 
-- --- ---------------- 
--      0 
+0

спасибо, теперь я смущен, если это то, чего хочет мой учитель или нет. кажется немного для нас, но он знал бы, что мы не можем использовать контрольное ограничение. спасибо за hlep –

+0

Я бы ожидал, что ваш учитель с удовольствием узнает, что вы обнаружили, что предложение 'CHECK' принято, но оно не применяется MySQL. Он будет рад, что вы его протестировали, и обнаружил это.Если это необходимо для обеспечения этого в базе данных, триггеры «ПЕРЕД ВСТАВКОЙ» и «ПЕРЕД ДОПОЛНИТЕЛЬНЫМ» являются единственным реальным механизмом, доступным в MySQL. – spencer7593

+0

«Теоретически нет никакой разницы между теорией и практикой. На практике это есть». Когда вы расскажете своему учителю об этом открытии, убедитесь, что у вас есть демонстрационный тест. SQL Fiddle действительно удобен для этого [** SQL Fiddle Demonstration ** http://sqlfiddle.com/#!9/27a45/1](http://sqlfiddle.com/#!9/27a45/1) – spencer7593

Смежные вопросы