2016-08-06 4 views
0

Я собираюсь использовать ограничения mysql, чтобы предотвратить ввод чисел меньше нуля. Я нашел этот запрос от W3schools.Mysql check Constraint не работает

CREATE TABLE Persons 
(
P_Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255), 
CHECK (P_Id>0) 
) 

Но когда я вставляю 0 Это позволяет мне сделать это. Есть идеи?

+0

[** Посмотрите, как проверочное ограничение достигается за счет запуска в MySQL **] (http://stackoverflow.com/questions/37904425/constant -column-значение-в-MySQL-таблицы/37904564 # 37904564) – 1000111

ответ

1

В настоящее время MySQL не поддерживает check, что означает, что он анализирует ваше определение, но игнорирует часть check.

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

The docs

Для достижения того же вы можете определить триггер и отменить обновление/вставить при необходимости с СИГНАЛ

SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid P_Id'; 

Но ваша актуальная проблема здесь в том, что вы этого не сделаете определите P_Id как автоматическое приращение ПЕРВИЧНЫЙ КЛЮЧ. Затем БД делает все для вас.

Тогда вы не предоставляете P_Id. БД номера этой колонки, начиная с 1.

И вы на самом деле не должны использовать W3Schools. Их тотальмены плохи.

1

Для других механизмов хранения, сервер MySQL разбирает и игнорирует FOREIGN KEY и ЛИТЕРАТУРЫ синтаксис CREATE TABLE заявления. Предложение CHECK анализируется, но игнорируется всеми механизмами хранения. См. Раздел 1.8.2.3, «Различия в внешних ключах».

вы можете передать этот ответ CHECK constraint in MySQL is not working

0

Вариант 2, использование генерируемого столбец в сочетании с утверждением CASE, а не нулевым ограничением. Например:

CREATE TABLE Persons 
(
P_Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255), 
CHECK_GEN_FIELD int AS (CASE WHEN P_Id>0 THEN 1 ELSE NULL END) NOT NULL 
); 

Запрос OK, 0 затронутых строк (0,04 сек)

MySQL> вставить лиц (P_ID, ЬазШате) значения (10, 'тест');

запроса ОК, 1 ряд пострадавших (0,00 сек)

MySQL> вставить лиц (P_ID, LastName) значений (0, 'тест');

ERROR 1048 (23000): Колонка 'CHECK_GEN_FIELD' не может быть пустым

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