SQL целочислен диапазон при създаване на таблици

Опитвам се да дам на моя INT в един от моите оператори за създаване набор от възможни стойности, т.е.

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