2015-04-08 4 views
1

Я хочу, чтобы оператор вставки на провал, если столбец year не 2014 или 2015Как я могу поставить условие на колонке о создании

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

CREATE TABLE `movies` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(345) DEFAULT NULL, 
    `year` int(11) DEFAULT NULL, 
    `imdbid` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4545 DEFAULT CHARSET=utf8; 
+0

насчет UPDATE? – jarlh

ответ

3

Добавить check ограничение

CREATE TABLE `movies` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(345) DEFAULT NULL, 
    `year` int(11) DEFAULT NULL, 
    `imdbid` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
CHECK `year` in (2014,2015) 
) ENGINE=InnoDB AUTO_INCREMENT=4545 DEFAULT CHARSET=utf8; 

или

ALTER TABLE `movies` 
ADD constraint checkyear check (`year`in (2014,2015)) 

EDIT

на основе обновлений от jarlh, CHECK ограничение не очень хорошо с MySQL. согласно MySQL Reference Manual

Оговорка ПРОВЕРКА анализируется, но игнорируется всеми механизмами хранения

Вы можете создать Trigger для имитации CHECK ограничения. Что-то вроде этого.

CREATE TRIGGER trg BEFORE INSERT ON movies 
FOR EACH ROW BEGIN 
IF (New.year NOT IN(2014,2015)) 
THEN 
    signal sqlstate '45000' 
    set message_text = 'check failed'; 
END IF; 
END; 

Вы можете обратиться к следующему резьбу для получения дополнительной информации

CHECK constraint in MySQL is not working

Can a MySQL trigger simulate a CHECK constraint?

+1

Кто-то сказал, что MySQL не очень хорошо справляется с контрольными ограничениями. Вы знаете, что это значит? – jarlh

+2

http://sqlfiddle.com/#!9/ce873/1 – jarlh

+0

@jarlh - yep, [CHECK] (http://dev.mysql.com/doc/refman/5.7/en/create-table.html) анализируется, но игнорируется всеми механизмами хранения. Триггер будет лучшим решением – ughai

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