为什么在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函数实现自动生成唯一字符串主键:
- 先执行修改后的建表语句,建议把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));
- 再执行触发器创建语句:
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
相关产品推荐
相关产品推荐

