SQL Server - 引用CHECK子句中的另一列

问题描述 投票:1回答:1

希望你有一个美好的一天。我想做这样的事情。

CREATE TABLE Certificat
 (
 num_certificat SMALLINT NOT NULL,
 description TEXT NOT NULL,
 Date_depot DATE NOT NULL CHECK(Date_depot <= GETDATE()),
 Date_validation DATE NOT NULL CHECK(Date_validation > Date_depot),
 num_auteur SMALLINT NOT NULL,
 num_innovation SMALLINT NOT NULL,

 CONSTRAINT pk_numc PRIMARY KEY(num_certificat),
 CONSTRAINT fk_au FOREIGN KEY(num_auteur) REFERENCES Auteur(num_auteur) ON 
 DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_inn FOREIGN KEY(num_innovation) REFERENCES 
 Innovation(num_innovation) ON DELETE CASCADE ON UPDATE CASCADE,
 );

但我得到这个错误:

消息8141,级别16,状态0,行4列'Date_validation'的列CHECK约束引用另一列,表'Certificat'。消息1750,级别16,状态0,行4无法创建约束或索引。查看以前的错误。

那么如何将另一列引用到CHECK子句中呢?我希望表格拒绝Date_depot大于Date_validation的条目。

sql sql-server
1个回答
1
投票

您需要在表级创建它 - 而不是在列旁边内联。

 CREATE TABLE Certificat
(
    num_certificat SMALLINT NOT NULL,
    description TEXT NOT NULL,
    Date_depot DATE NOT NULL CHECK(Date_depot <= GETDATE()),
    Date_validation DATE NOT NULL,
    num_auteur SMALLINT NOT NULL,
    num_innovation SMALLINT NOT NULL,
    CHECK(Date_validation > Date_depot), /*<----- Moved here*/
    CONSTRAINT pk_numc PRIMARY KEY(num_certificat),
    CONSTRAINT fk_au FOREIGN KEY(num_auteur) REFERENCES Auteur(num_auteur) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_inn FOREIGN KEY(num_innovation) REFERENCES Innovation(num_innovation) ON DELETE CASCADE ON UPDATE CASCADE,
);

您还应该考虑给它一个明确的名称。例如

CONSTRAINT ck_validation_after_depot CHECK(Date_validation > Date_depot)
© www.soinside.com 2019 - 2024. All rights reserved.