【问题标题】:AUTO_INCREMENT in composite key复合键中的 AUTO_INCREMENT
【发布时间】:2012-07-04 19:33:04
【问题描述】:

我有如下表格

个人信息

CREATE TABLE personalInfo(userid BIGINT AUTO_INCREMENT PRIMARY KEY)

专利信息

CREATE TABLE patentInfo 
(
 userid BIGINT,
 patentId BIGINT AUTO_INCREMENT,
 FOREIGN KEY (userid) REFERENCES personalInfo(userid), 
 PRIMARY KEY (userid,patentId)
)

在创建表 patentInfo 时,我收到错误

Incorrect table definition; there can be only one auto column and it must be defined as a key.

我想做的是为用户添加专利。所以我试图将patentId 用作AUTO_INCREMENT 并将compiste 主键作为patentIduserid 的组合。

知道如何完成这项工作吗?

更新 1:

我的目标是,我不想在 mysql 查询中插入 patentId。 mysql 自己会创建下一个数字。

【问题讨论】:

  • 用户和患者有什么区别?

标签: mysql database-design auto-increment composite-key


【解决方案1】:

既然patentIdAUTO_INCREMENT,那么它应该是主键。

【讨论】:

  • patentInfo table with PK patentId 听起来不错,为什么只有一个就够了你还要复合主键?
  • 我明白你的意思。保持patentId 为PK。还是很好奇,有没有办法创建这样的复合键??
【解决方案2】:

我将使用Person 而不是user -- 假设您有一家诊所...

  • PatientPerson
  • DoctorPerson
  • Doctor 也可能成为(是)Patient

  • 将所有常见的个人信息保存在Person
  • Patient 中仅针对患者的列
  • 只有Doctor 中的特定医生
  • 子类型是包容性的,所以判别器有 {B= both}
  • 注意主键如何传播到子类型表中。

总而言之,对于您的具体示例,两个表都应将 UserID 作为主键。在第二个表中,它也是一个外键。

【讨论】:

    【解决方案3】:

    您不必在一个表中自动增加值。所以您必须使用 last_insert_id() 或类似的东西在代码级别手动插入用户 ID,而不是在数据库级别执行此操作

    【讨论】:

      【解决方案4】:

      如果 auto_increment 列是主键的第一个子句,您似乎可以拥有一个带有一个 auto_increment 列的复合主键。

      以下在我的机器上工作

      CREATE TABLE patentInfo 
      (
        userid BIGINT,
        patentId BIGINT AUTO_INCREMENT,
        PRIMARY KEY (patentId, userid)
      )
      

      在哪里

      PRIMARY KEY (userid, patentId)
      

      给出你看到的错误。

      在 MariaDB 10.0 YMMV 上测试

      【讨论】:

        猜你喜欢
        • 2011-04-17
        • 2013-03-16
        • 2015-06-09
        • 2019-06-03
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 2016-11-08
        • 1970-01-01
        相关资源
        最近更新 更多