Mysql 错误1075不正确的表定义;只能有一个自动列,必须将其定义为键

Mysql 错误1075不正确的表定义;只能有一个自动列,必须将其定义为键,mysql,sql,Mysql,Sql,我正在创建表之间的关系,这是自动递增两列id\u quote和seq\u quote所必需的。在id\u quote列中,我正在引用另一个表(tb\u core\u process\u id\u quote),我已经在该表中增加了它 下表(tb_核心_流程_客户_数据)将被其他表用于捕获公共数据和主要客户数据。要进行验证,必须使用此数据库中整个表共有的三个验证键:cpf\u cnpj、id\u quote和seq\u quote tb\核心\流程\客户\数据查询: CREATE TABLE tb

我正在创建表之间的关系,这是自动递增两列
id\u quote
seq\u quote
所必需的。在
id\u quote
列中,我正在引用另一个表(tb\u core\u process\u id\u quote),我已经在该表中增加了它

下表(tb_核心_流程_客户_数据)将被其他表用于捕获公共数据和主要客户数据。要进行验证,必须使用此数据库中整个表共有的三个验证键:
cpf\u cnpj
id\u quote
seq\u quote

tb\核心\流程\客户\数据查询:

CREATE TABLE tb_core_process_customer_data(
cpf_cnpj VARCHAR(255) NOT NULL,
id_quotation INT NOT NULL,
seq_quotation INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
dt_birth DATE,
cd_insurance_type INT,
PRIMARY KEY (cpf_cnpj, seq_quotation, id_quotation),
FOREIGN KEY (cd_insurance_type) REFERENCES tb_nm_insurance_type(cd_insurance_type),
FOREIGN KEY (id_quotation) REFERENCES tb_core_process_id_quotation(id_quotation)
);
tb\U核心\U流程\U id\U报价查询:

CREATE TABLE tb_core_process_id_quotation(
id_quotation INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id_quotation)
);
因此,我很难将这三个关键点联系起来并进行验证。当我尝试创建tb_核心_流程_客户_数据时,以下消息显示我:


错误1075(42000):表定义不正确;只能有一个自动列,必须将其定义为键

MySQL使用自动增量字段上的键以加快查找速度。您将auto_increment字段作为pk中的第二个字段,因此MySQL无法单独使用pk来检查auto_increment的值,因此会显示错误消息

有很多方法可以解决这个问题

  • seq_quote
    字段中添加一个单独的键(不必是唯一的或主键)

  • 自动增量值无论如何都是唯一的,因此您可以将其单独设置为pk,并在其他2个字段上添加另一个索引。在唯一索引或pk中使用自动增量打包其他字段有点毫无意义——除非您使用MySQL。(见下文注释)

  • 我不确定它是否有效,但您可以尝试将
    seq_quote
    移动到当前PK中的第一个字段

  • 如果您的目的是使用自动递增来为每个组增加一个递增的数字,那么

  • 确保使用myisam或bdb表类型
  • 如果innodb不使用自动增量,请使用触发器(请参阅)
  • 选项3(将自动增量字段放在首位)解决了这一问题。选项3(将自动公司添加为复合pk中的第一个字段)也适用于我。