踩了个研发建表没有设置主键的坑,mark一下。数据库实例是 tdsql mysql 5.7,服务建表的时候直接报错:ERROR 1173 (42000):This table type requires a primary key,最后乖乖加上主键解决。
tdsql中设置建表必须需要显式主键的参数为 reject_table_no_pk
至于为什么建表必须创建主键应该是主要有两个原因,一个是mysql规范,一个是怕影响性能埋坑。
TDSQL 内核使用 row 格式的 binlog 复制。根据目前 MariaDB/MySQL 的实现方式,如果一个 update/delete 语句更新或者删除了很多行,那么到了备机上面,更新或者删除每个行时候,需要使用索引扫描或者全表扫描来找到这个行,导致备机复制变得非常慢,这是非常严重的问题。 在 TDSQL 的告警平台上面就有用户出现过主备延迟因此变得非常大的告警。为了避免这些致命问题的出现,所以才有“自动增加主键”和“禁止 create table/alter table 语句产生无主键的表”
解决方案
为表添加显式主键
1.通过 ALTER TABLE 语句为表添加主键 ALTER TABLE 表名 ADD PRIMARY KEY (列名); 2.或者修改建表语句,添加主键 CREATE TABLE IF NOT EXISTS `zone_xxx_job` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `dispatch_job_id` bigint(20) NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB CHARSET = utf8mb4; 3.验证主键是否生效 SHOW CREATE TABLE 表名;
注意事项:
列要求:主键列必须满足以下条件:
值唯一且非空。
数据类型适合作为索引(推荐整数类型如
INT
、BIGINT
)。数据冲突:若表中已有数据,需确保主键列无重复值,否则会报错
Duplicate entry
。