2015-12-07 2 views
1

Я создал график таблицы с проверочным ограничением:SQL СНЕСК не работает должным образом

mysql> create table schedule(order_date date, dely_date date 
          check(dely_date>order_date)); 
Query OK, 0 rows affected (0.50 sec) 

Когда я ввожу значение, которое нарушает проверочное ограничение, отчеты SQL нет ошибок.

mysql> insert into schedule values('2015-11-20','2014-12-25'); 
Query OK, 1 row affected (0.10 sec) 

mysql> select * from schedule; 
+------------+------------+ 
| order_date | dely_date | 
+------------+------------+ 
| 2015-11-20 | 2014-12-25 | 
+------------+------------+ 
1 row in set (0.00 sec) 

Я вставил dely_date, который приходит до order_date.

ответ

1

CHECK ограничение в MySQL игнорируется как в Jakub Kania's answer

Пример работы CHECK с использованием SQL Server:

create table #schedule(order_date date, 
dely_date date, 
check(dely_date>order_date)); 

insert into #schedule values('2015-11-20','2014-12-25'); 
-- The INSERT statement conflicted with the CHECK constraint "CK_#schedule_A59B8DED". 
-- The conflict occurred in database "tempdb", table "dbo.#schedule___ 
-- __________________00000000C9D8". The statement has been terminated. 

INSERT INTO #schedule values('2015-12-24','2015-12-25'); 

SELECT * 
FROM #schedule; 

LiveDemo

Вы можете использовать триггер, чтобы сделать проверки:

CREATE TABLE `schedule`(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
         order_date DATETIME, 
         dely_date DATETIME);    

CREATE TRIGGER `schedule_trg_ins` BEFORE INSERT ON `schedule` 
FOR EACH ROW 
BEGIN 
    IF NOT(New.dely_date>New.order_date) THEN 
    SIGNAL SQLSTATE '10000' 
     SET MESSAGE_TEXT = 'check constraint on schedule failed during insert'; 
    END IF; 
END; 

CREATE TRIGGER `schedule_trg_upd` BEFORE UPDATE ON `schedule` 
FOR EACH ROW 
BEGIN 
    IF NOT(New.dely_date>New.order_date) THEN 
    SIGNAL SQLSTATE '10000' 
     SET MESSAGE_TEXT = 'check constraint on schedule failed during update'; 
    END IF; 
END; 

INSERT INTO `schedule`(order_date, dely_date) 
VALUES ('2015-12-24','2015-12-25'); 

INSERT INTO `schedule`(order_date, dely_date) 
VALUES ('2015-12-26','2015-12-25'); 
-- check constraint on schedule failed during insert 

UPDATE `schedule` 
SET order_date = '2015-12-26' 
WHERE id = 1; 
-- check constraint on schedule failed during update 

SqlFiddleDemo

+0

спасибо. Но почему он не работал без триггера? – user3297764

+0

@ user3297764 Потому что MySQL не реализует синтаксис CHECK. Это только заполнитель. – lad2025

2

О, он работает правильно. Согласно manual:

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

Вы можете захотеть попробовать децибел, что немного более здоровым.

+1

Мне нравится 'sane' :) Следует отметить, что один обходной путь заключается в использовании триггера. [Пример базы данных Sane] (https://data.stackexchange.com/stackoverflow/query/404686) + вам нужно запятую перед 'CHECK'. – lad2025

+0

Извините. Я не понимаю. – user3297764

+0

Что я должен делать, чтобы sql сообщал об ошибке? – user3297764

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