MySQL игнорируя проверочное ограничение - PullRequest
0 голосов
/ 11 октября 2018

У меня есть этот код, и я хочу реализовать его в MySQL, но CHECK не поддерживается.Как бы я это сделал?

CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CHECK (lower(type_of_passenger)='child' OR lower(type_of_passenger)='student' OR lower(type_of_passenger)='senior')
);

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Похоже, вы действительно пытаетесь реализовать ENUM:

type_of_passenger ENUM('child', 'student', 'senior')

По умолчанию MySQL не проверяет значения ENUM, поэтому, если вы попытаетесь сохранить что-то еще, он сохранит пустойстрока, но если включен строгий режим SQL, он сообщит об ошибке.

Другой вариант - сделать этот внешний ключ для таблицы, в которую вы вводите действительные значения.

CREATE TABLE passenger_types (
    type VARCHAR(20) NOT NULL PRIMARY KEY
);
INSERT INTO passenger_types (type) VALUES
('child'), ('student'), ('senior');


CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CONSTRAINT FOREIGN KEY (type_of_passenger) REFERENCES passenger_types (type)
);
0 голосов
/ 11 октября 2018

Вы уверены, что вам нужен этот чек?Поскольку первичный ключ - type_of_passenger, у вас будет только три строки. Это похоже на перебивание

. Вы можете просто INSERT эти 3 строки и двигаться дальше.Если вы ссылаетесь на это поле во внешнем ключе, вы все равно будете ограничены значениями в таблице

Фактически, как только вы свяжетесь с каждым значением с помощью внешнего ключа, который использует ON UPDATE RESTRICT и ON DELETE RESTRICTвы все равно не сможете их изменить

Единственное действительное беспокойство, которое я вижу здесь, это то, что вы хотите позволить пользователю БД изменять price, но не type_of_passenger

Если у вас INSERT правильные (или заглушки) данные для начала, вы можете контролировать доступ к таблице и столбцу с помощью прав доступа

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...