You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:09:27