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

CREATE TABLE Producto
(
    Idproducto [int] PRIMARY KEY NOT NULL 
        DEFAULT (NEXT VALUE FOR Idprod),
    Nombre [varchar](100) NOT NULL,
    Precio_Unitario DECIMAL (18,2) 
);
0
douglas 27 Ноя 2021 в 13:50

2 ответа

Лучший ответ

Вы можете использовать ограничение CHECK. Например:

CREATE TABLE Producto
(
    Idproducto int PRIMARY KEY NOT NULL,
    Nombre varchar(100) NOT NULL,
    Precio_Unitario DECIMAL(18, 2),
    CONSTRAINT chk1 CHECK (Precio_Unitario <> 0)
);

Подойдут типичные вставки:

INSERT INTO Producto (Idproducto, Nombre, Precio_Unitario) 
VALUES (1, 'A', 2);

INSERT INTO Producto (Idproducto, Nombre, Precio_Unitario) 
VALUES (2, 'B', NULL);

Но если вы попробуете:

INSERT INTO Producto (Idproducto, Nombre, Precio_Unitario) 
VALUES (3, 'C', 0);

Вы получите сообщение об ошибке:

Msg 547 Уровень 16 Состояние 0 Строка 1
Оператор INSERT конфликтует с ограничением CHECK "chk1". Конфликт произошел в базе данных «fiddle_914c4e0be5e144138dc870cf3d5a6ced», таблица «dbo.Producto», столбец «Precio_Unitario».

Msg 3621 Уровень 0 Состояние 0 Строка 1
Заявление было прекращено.

См. Пример выполнения на db <> fiddle.

3
marc_s 27 Ноя 2021 в 14:02

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

CREATE TABLE #Producto
(
    Idproducto [int]  PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR Idprod),
    Nombre [varchar](100) NOT NULL,
    Precio_Unitario DECIMAL  (18,2),
    constraint chk_Precio_Unitario check (Precio_Unitario is null or Precio_Unitario <> 0) 
)
1
GuidoG 27 Ноя 2021 в 13:57