【问题标题】:Combined primary keys in MySQLMySQL中的组合主键
【发布时间】:2013-04-11 14:42:18
【问题描述】:

这可能听起来有点愚蠢 - 但我想设置以下场景:

ClientID,AdvertID  
  1,1  
  2,1  
  3,1  
  2,2  
  2,3  
  1,2  

因此,ClientID 和 AdvertID 都必须是主键,但只有 AdvertID 是自动递增的。 AdvertID 必须重新启动与其链接到的 ClientID 相关的编号。此外,ClientID 也将是一个外键。

到目前为止,我所做的只是在 PHPMyAdmin 中创建表时创建了一个组合主键,但这只是继续自动递增值,而不考虑实际的 clientID

有人知道怎么做吗?我知道这是可能的,我以前见过。我只是不知道它是怎么做到的。

提前致谢!

P.S:为了清楚起见,这是针对 MySQL v5.5

【问题讨论】:

    标签: php mysql primary-key composite-primary-key


    【解决方案1】:
    LOCK TABLES tbl WRITE;
    
    select AdvertID from tbl where ClientID = :c_id //save the number somewhere
    
    insert into tbl (ClientID, AdvertID) value (:c_id, :saved_ad_id+1)
    
    UNLOCK TABLES
    

    首先,获得对表的独占写入权限(只是为了确保避免竞争条件)

    然后,搜索您的客户端当前的广告值,如果需要将null转换为0,然后将其增加+1

    第三步,将情侣存入数据库

    最后,解锁表。

    不需要自增字段,因为该表中没有真正的自增字段。

    【讨论】:

    • 不太确定我说的是否正确,但不是每个主键都必须是唯一的吗?还是说INSERT INTO tbl(C, A) VALUES (1, 2) 然后再INSERT INTO tbl(C, A) VALUES (2, 2) 可以吗?换句话说,我问的是PK的每个部分是否必须是唯一的,或者组合的PK作为一个整体是否必须是唯一的?
    • 如果您有 PK(A,B),那么每对 (a,b) 对必须是唯一的。只要您有不同的“b”值,您就可以拥有多次“a”值。
    • 酷,有道理。谢谢!
    【解决方案2】:

    据我所知,您无法设计一个结构来处理值何时应根据其父键重新开始递增。这取决于您的服务器端逻辑(在您的情况下为 PHP)在收到新的 ClientID 时制作相关案例,从头开始填充 AdvertID。

    【讨论】:

      【解决方案3】:

      我唯一能想到的就是一个插入前触发器,它为你的键执行自动计数逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-02
        • 2019-03-12
        • 2013-03-05
        • 2016-04-25
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多