TDSQL MySQL ERROR 1173 (42000):This table type requires a primary key报错处理

踩了个研发建表没有设置主键的坑,mark一下。数据库实例是 tdsql mysql 5.7,服务建表的时候直接报错:ERROR 1173 (42000):This table type requires a primary key,最后乖乖加上主键解决。

tdsql中设置建表必须需要显式主键的参数为 reject_table_no_pk

TDSQL MySQL ERROR 1173 (42000):This table type requires a primary key报错处理

至于为什么建表必须创建主键应该是主要有两个原因,一个是mysql规范,一个是怕影响性能埋坑。

TDSQL MySQL ERROR 1173 (42000):This table type requires a primary key报错处理

 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 表名;

注意事项

  • 列要求:主键列必须满足以下条件:

    • 值唯一且非空。

    • 数据类型适合作为索引(推荐整数类型如 INTBIGINT)。

  • 数据冲突:若表中已有数据,需确保主键列无重复值,否则会报错 Duplicate entry


参考:记一次数据库迁移的过程采坑过程

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6371.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注