Целочисленный диапазон SQL при создании таблиц

Я пытаюсь дать INT в одном из моих операторов create диапазон возможных значений, т.е.

CREATE TABLE Site(
    **SiteID INT (1,4),**
    UserID INT UNSIGNED Not Null,
    Name varchar(128) Unique Not Null,
    Foreign Key (UserID) References Users(UserID),
    Primary key (SiteID)
);

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


person Nick    schedule 18.04.2013    source источник
comment
w3schools.com/sql/sql_check.asp   -  person OldProgrammer    schedule 18.04.2013
comment
Если это ваш первичный ключ, зачем вам диапазон?   -  person Dan Bracuk    schedule 18.04.2013
comment
SiteID в этом случае относится к уровню полномочий кого-либо на Сайте, где 1 = администратор, 2 = второй по силе, 3 = 3-й по силе, 4 = 4-й по силе.   -  person Nick    schedule 18.04.2013
comment
Вот для чего нужны внешние ключи.   -  person Dan Bracuk    schedule 18.04.2013
comment
@OldProgammer, спасибо. Это решило это.   -  person Nick    schedule 18.04.2013
comment
Итак, в этой таблице будет всего 4 записи? Если вы ограничиваете SiteID от 1 до 4, а SiteID является вашим первичным ключом, то в этой таблице может быть максимум 4 записи.   -  person Richard    schedule 18.04.2013


Ответы (1)


Примечание автора: первые две части этого ответа неверны. Я думал, что MySQL поддерживает ограничения CHECK, но это не так. Все еще нет. Чтобы ограничить столбцы простым списком значений, используйте подход ENUM в конце этого ответа. Если логика более сложная (диапазон значений, значение на основе другого столбца и т. д.), единственным вариантом MySQL является триггер.


Вам нужно ограничение CHECK, если это INT:

CREATE TABLE Site (
  SiteID INT,
  CONSTRAINT SiteID_Ck CHECK (SiteID IN (1, 2, 3, 4)),
  ... and the rest

Or:

CREATE TABLE Site (
  SiteID INT,
  CONSTRAINT SiteID_Ck CHECK (SiteID BETWEEN 1 AND 4),
  ... and the rest

Или, если вы можете жить со строкой SiteID, тогда:

CREATE TABLE Site (
  SiteID ENUM('1', '2', '3', '4'),
  ... and the rest
person Ed Gibbs    schedule 18.04.2013
comment
Похоже, что CHECK на самом деле не работает в MySQL: предложение CHECK анализируется, но игнорируется всеми механизмами хранения. dev.mysql.com/doc/refman/5.0/en/ create-table.html - person Jack O'Connor; 28.10.2015
comment
Вы правы, Джек, и спасибо, что указали на это. Я не помню, чтобы отвечал на этот вопрос, потому что это было так давно, но примерно в то время я просто баловался MySQL после многих лет работы с Oracle и SQL Server. Позже я узнал, что он не поддерживает ограничения CHECK. Трудно было в это поверить, но 2+ года все равно нет. Любопытно, потому что я думаю, что это будет проще реализовать, чем PK или FK. Тем не менее, последний вариант (ENUM) работает. Я добавил отказ от ответственности. - person Ed Gibbs; 29.10.2015