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

为什么在SQL中使用VARCHAR作为主键时会触发语法报错?

SQL建表1064报错解决方案(VARCHAR作为主键场景)

报错#1064的核心原因是你对VARCHAR类型字段使用了两个不兼容的属性:

  • UNSIGNED 是整数、浮点数这类数值类型的专属属性,用于标识字段只能存储非负值,字符串类型完全不支持该属性
  • AUTO_INCREMENT 自增属性仅支持整数类型字段,VARCHAR作为字符串类型无法使用该属性

因为你明确要求必须用VARCHAR作为主键,对应修改即可,两种常用方案如下:

方案1:手动指定主键值

如果业务逻辑中可以自行控制pid的生成和输入,直接删除不兼容的属性即可,修改后的建表语句:

CREATE TABLE mactor(
pid VARCHAR(30) NOT NULL,
fname VARCHAR(30) NOT NULL,
lname VARCHAR(30) NOT NULL,
gender VARCHAR(20) NOT NULL,
PRIMARY KEY (pid));

插入数据时需要自行指定唯一的pid值,示例:

INSERT INTO mactor (pid, fname, lname, gender) VALUES ('act_001', '李', '四', '女');

方案2:自动生成VARCHAR类型主键

如果需要类似自增的自动生成主键效果,不需要手动输入,可以通过触发器结合UUID函数实现自动生成唯一字符串主键:

  1. 先执行修改后的建表语句,建议把pid长度调整为32适配UUID生成结果:
CREATE TABLE mactor(
pid VARCHAR(32) NOT NULL,
fname VARCHAR(30) NOT NULL,
lname VARCHAR(30) NOT NULL,
gender VARCHAR(20) NOT NULL,
PRIMARY KEY (pid));
  1. 再执行触发器创建语句:
DELIMITER //
CREATE TRIGGER before_mactor_insert
BEFORE INSERT ON mactor
FOR EACH ROW
BEGIN
  -- 插入时如果未指定pid,自动生成32位无分隔符的唯一字符串
  IF NEW.pid IS NULL OR NEW.pid = '' THEN
    SET NEW.pid = REPLACE(UUID(), '-', '');
  END IF;
END //
DELIMITER ;

配置完成后插入数据不需要指定pid,会自动填充唯一值,示例:

INSERT INTO mactor (fname, lname, gender) VALUES ('王', '五', '男');

内容的提问来源于stack exchange,提问作者Chacha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:57:03