设置customer_id为Generated类型Primary Key时SQL语法报错,求正确语句
如何设置自动生成的customer_id主键
嘿,别慌!设置自动生成的主键其实没那么复杂,不过得注意不同数据库的语法差异哦。我给你整理了几个主流数据库的正确写法,你对应自己使用的数据库来选就行:
MySQL/MariaDB
在MySQL里,用AUTO_INCREMENT就能实现自动生成主键,而且PRIMARY KEY本身就包含了NOT NULL和UNIQUE的约束,所以不用额外声明这两个:
CREATE TABLE customers ( customer_id INT AUTO_INCREMENT PRIMARY KEY, -- 其他字段... );
PostgreSQL
PostgreSQL有两种常用方式,推荐用更现代的GENERATED AS IDENTITY(PostgreSQL 10+支持),也可以用传统的SERIAL:
现代写法(推荐)
CREATE TABLE customers ( customer_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 其他字段... );
传统写法
CREATE TABLE customers ( customer_id SERIAL PRIMARY KEY, -- 其他字段... );
SERIAL和GENERATED AS IDENTITY都会自动创建序列来生成值,而且PRIMARY KEY同样隐含了NOT NULL和UNIQUE。
SQL Server
SQL Server用IDENTITY(起始值, 增量)来实现自增主键:
CREATE TABLE customers ( customer_id INT IDENTITY(1,1) PRIMARY KEY, -- 其他字段... );
这里IDENTITY(1,1)表示从1开始,每次增加1,PRIMARY KEY同样包含了NOT NULL和UNIQUE约束。
Oracle
Oracle 12c及以上版本支持GENERATED AS IDENTITY,更早的版本需要用序列加触发器:
Oracle 12c+ 写法
CREATE TABLE customers ( customer_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 其他字段... );
旧版本写法(Oracle 11g及以下)
先创建序列:
CREATE SEQUENCE customer_seq START WITH 1 INCREMENT BY 1;
然后创建表,再添加触发器:
CREATE TABLE customers ( customer_id NUMBER PRIMARY KEY, -- 其他字段... ); CREATE OR REPLACE TRIGGER customer_id_trigger BEFORE INSERT ON customers FOR EACH ROW BEGIN SELECT customer_seq.NEXTVAL INTO :NEW.customer_id FROM DUAL; END; /
小提示
- 不用单独写
NOT NULL和UNIQUE,因为PRIMARY KEY约束已经自动包含了这两个属性,重复写反而可能造成冗余或者语法问题哦。 - 确保你使用的数据库版本支持对应的语法(比如PostgreSQL的
GENERATED AS IDENTITY需要10以上)。
内容的提问来源于stack exchange,提问作者gymcode
相关产品推荐
相关产品推荐

