SQL - 创建表时,如何在另一列满足特定要求时使其成为必需列?

标签 sql sql-server

我正在使用 Microsoft SQL Server Management Studio。所以这就是我现在所拥有的:

CREATE TABLE Product 
(
    product_id          INT             NOT NULL    PRIMARY KEY IDENTITY,
    product_code        CHAR(4)         NOT NULL,   --For a book use  'BOOK'
    product_name        VARCHAR(40)     NOT NULL,
    product_desc        VARCHAR(5000),
    book_author         INT,
    book_publisher      INT,
    product_price       SMALLMONEY      NOT NULL    CHECK (product_price >= 0),     
    FOREIGN KEY (book_author)       REFERENCES Author
);

因此,如果 product_code == 'BOOK',我想让 book_author 和 book_publisher 不能为空。

这可能吗?如何实现?

最佳答案

我会这样做:

CREATE TABLE Product (
  product_id INT NOT NULL PRIMARY KEY IDENTITY
  , product_code CHAR(4) NOT NULL
  , product_name VARCHAR(40) NOT NULL
  , product_desc VARCHAR(5000)
  , book_author INT
  , book_publisher INT
  , product_price SMALLMONEY NOT NULL CHECK (product_price >= 0)
  , CONSTRAINT CHK_author CHECK (
    CASE 
      WHEN product_code = 'BOOK' AND (book_author IS NULL OR book_publisher IS NULL) THEN 0
      ELSE 1
    END = 1
    )
);

CHK_author 约束将检查您的 product_code 是否为 BOOK,如果是,则检查 book_authorbook_publisherNULL 值。如果其中之一是 - 它将限制声明。

这是 SQL Fiddle

关于SQL - 创建表时,如何在另一列满足特定要求时使其成为必需列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34690681/

相关文章:

mysql - 对 JOIN 感到困惑 - 结果中数据丢失

sql-server - MS SQL Server Management Studio 2014,以及旧版 (2012) SQL Server

sql-server - 一对多存储表 SQL Server

mysql - 使用存储过程插入和更新

java - 由于插入查询中的单引号导致的错误

mysql - 查找表中的不一致

sql - 维护客户数据

c# - 在单个查询中更新表中的多个值

sql-server - 如何在 Ms Sql select 中设置变量

sql-server - SQL Server 复制的可靠性如何?