Как ограничить значение столбца в SQLite / MySQL - PullRequest
19 голосов
/ 16 июня 2011

Я хотел бы ограничить значение столбца в таблице SQL.Например, значениями столбца могут быть только «автомобиль», «велосипед» или «фургон».Мой вопрос заключается в том, как добиться этого в SQL, и это хорошая идея сделать это на стороне БД, или я должен позволить приложению ограничить ввод.

У меня также есть намерение добавить или удалить большезначения в будущем, например, «грузовик».

Тип используемых мной баз данных: SQLite и MySQL.

Ответы [ 5 ]

32 голосов
/ 16 июня 2011

Добавьте новую таблицу, содержащую эти транспортные средства, и сделайте свой столбец внешним ключом для этой таблицы. Новые транспортные средства могут быть добавлены в таблицу в будущем, и определение вашего столбца останется прежним.

При такой конструкции я бы определенно решил регулировать это на уровне БД, а не на уровне приложения.

22 голосов
/ 16 июня 2011

Для MySQL вы можете использовать тип данных ENUM.

column_name ENUM («маленький», «средний», «большой»)

См. Справочник по MySQL: Тип ENUM

Чтобы добавить к этому, я считаю, что всегда лучше ограничить на стороне БД И на стороне приложения. Enum плюс поле выбора, и вы закрыты.

8 голосов
/ 16 июня 2011

Да, рекомендуется добавить проверочные ограничения.Проверочные ограничения используются для обеспечения достоверности данных в базе данных и обеспечения целостности данных.Если они используются на уровне базы данных, приложения, использующие базу данных, не смогут добавлять недопустимые данные или изменять действительные данные, чтобы данные становились недействительными, даже если само приложение принимает недопустимые данные.

В SQLite:

create table MyTable
(
    name string check(name = "car" or name = "bike" or name = "van")
);

В MySQL:

create table MyTable
(
    name ENUM('car', 'bike', 'van')
);
4 голосов
/ 16 июня 2011

Вы бы использовали ограничение проверки. В SQL Server это работает так

ALTER TABLE Vehicles
ADD CONSTRAINT chkVehicleType CHECK (VehicleType in ('car','bike','van'));

Я не уверен, является ли это стандартом ANSI, но я уверен, что MySQL имеет аналогичную конструкцию.

2 голосов
/ 16 июня 2011

Если вы хотите пройти проверку на стороне DB, вы можете использовать триггеры.См. this для SQLite и подробные инструкции для MySQL.

Так что вопрос в том, следует ли вам использовать проверку базы данных или нет.Если у вас есть несколько клиентов - будь то разные программы или несколько пользователей (возможно, с разными версиями программы) - тогда путь к базе данных определенно лучше.База данных (надеюсь) централизована, поэтому вы можете отделить некоторые детали проверки.В вашем конкретном случае вы можете убедиться, что значение, вставляемое в столбец, содержится в отдельной таблице, в которой просто перечислены допустимые значения.

С другой стороны, если у вас мало опыта работы с базами данных, запланируйте таргетингнесколько разных баз данных, и у них нет времени на развитие опыта, возможно, наиболее целесообразным является простая проверка на уровне приложений.

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