如何在 SQL 中创建 table 时应用条件 'book id which consists of six alphanumeric characters and starts with B'?

How to apply the condition 'book id which consists of six alphanumeric characters and starts with B' during creating table in SQL?

我在 SQL 中创建的查询 'book' table(数据库):

CREATE TABLE book(
bookid VARCHAR(6) where bookid LIKE 'B_____',
bookTitle VARCHAR(50),
author VARCHAR(20),
genre VARCHAR(10) CHECK(genre IN('Mystery','Thriller')),
yearPublication INTEGER
);

当我 运行 此代码显示错误时:

missing right parenthesis.

在第二行 (bookid VARCHAR(6) where LIKE 'B_____'),当我删除条件 (where LIKE 'B_____') 时,table 已成功创建,但根据问题陈述,条件必须存在才能实现需要。执行后有人可以在此代码中提供更正吗?

您可以使用检查约束,例如关于已经是您的命令一部分的流派的约束。所以你的创建 table 命令将是:

CREATE TABLE book(bookid VARCHAR(6) 
CHECK (bookid LIKE 'B_____'), 
bookTitle VARCHAR(50), 
author VARCHAR(20), 
genre VARCHAR(10) 
CHECK(genre IN('Mystery','Thriller')), 
yearPublication INTEGER);

如果您想为约束设置名称(也为类型约束),这将起作用:

CREATE TABLE book(bookid VARCHAR(6)
CONSTRAINT chkBookId CHECK (bookid LIKE 'B_____'), 
bookTitle VARCHAR(50), 
author VARCHAR(20), 
genre VARCHAR(10) 
CONSTRAINT chkGenre CHECK (genre IN('Mystery','Thriller')), 
yearPublication INTEGER);

如果table已经存在(可能是因为你执行了没有约束的create table命令)而你需要添加约束,你可以执行以下操作:

ALTER TABLE book 
ADD CONSTRAINT chkBookId
CHECK (bookid LIKE 'B_____');

请注意:如果您确实需要限制字母数字字符而不是允许任何字符,则必须更改上面列出的命令。您可以使用这样的正则表达式:

CREATE TABLE book(bookid VARCHAR(6) 
CONSTRAINT chkBookId CHECK (bookid LIKE 'B_____' 
AND PATINDEX('%[^a-zA-Z0-9 ]%',bookid) = 0), 
bookTitle VARCHAR(50), 
author VARCHAR(20), 
genre VARCHAR(10) 
CONSTRAINT chkGenre CHECK(genre IN('Mystery','Thriller')), 
yearPublication INTEGER);

请查看此处是否正常工作:db<>fiddle

更好的是:

CREATE TABLE book(
bookid VARCHAR(6) CHECK (bookid LIKE 'B' + REPLICATE([A-Z0-9], 5)) ,
...
)
  • 如果您只想要字母,请删除类似的“0-9”部分
  • 如果您不想使用变音符号(重音、连字等...),只需在 CHECK 约束定义中的“bookid”之后添加一个 COLLATE 运算符,并使用 Latin1_General_CI_AS[= 等 AI 排序规则19=]
  • 如果您只需要大写字母,请使用 CS 排序规则,例如 Latin1_General_CS_AI
  • 如果您想要两者(没有变音符号和大写字母),请使用 CS_AS 排序规则
  • 如果您只需要小写字符,请使用 CS 排序规则将 [A-Z0-9] 替换为 [a-z0-9]