【问题标题】:Can I add Primary Key with many condition我可以添加许多条件的主键吗
【发布时间】:2017-05-07 13:38:01
【问题描述】:

我有第一个表名“mustahik_perorangan”和第二个表名“data_mustahik”

mustahik perorangan 在另一个表中有 4 个主键和外键 像这种情况

PRIMARY KEY (`mustahik_nik`,`ins_provinces_code`,`ins_cities_code`,`ins_institution_types_code`,`ins_institution_serial_no`),
 KEY `fk_reference_6` (`ins_provinces_code`,`ins_cities_code`,`ins_institution_types_code`,`ins_institution_serial_no`),
 CONSTRAINT `FK_ins_musper` FOREIGN KEY (`ins_provinces_code`, `ins_cities_code`, `ins_institution_types_code`, `ins_institution_serial_no`) REFERENCES `baznasgo_s_organization`.`institutions` (`provinces_code`, `cities_code`, `institution_types_code`, `institution_serial_no`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

我想将主键添加到表 mustahik_perorangan,所以 mustahik perorangan 有 5 个主键?

但我不能这样做,因为它有条件..

ALTER TABLE mustahik_perorangan ADD idc INT UNSIGNED NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY (`idc`);

你知道怎么做吗?

【问题讨论】:

标签: mysql


【解决方案1】:

一张表最多可以有一个主键约束。

主键约束可以包含多个列。我们将其称为复合键。


可以添加新列。

还可以在列上添加 UNIQUE 约束并在列上指定AUTO_INCREMENT 属性。

举个例子:

  ALTER TABLE mustahik_perorangan
    ADD idc INT UNSIGNED NOT NULL AUTO_INCREMENT
  , ADD UNIQUE KEY (`idc`)

也可以将第六列添加到现有的复合主键。但我认为这不是你真正想要的。

为了演示如何向现有复合主键添加列,我将提供一个示例。

请注意,必须删除并重新添加主键。并且必须为 AUTO_INCREMENT 列添加唯一键。

假设没有引用该表主键的外键。

  ALTER TABLE mustahik_perorangan
    DROP PRIMARY KEY
  , ADD idc INT UNSIGNED NOT NULL AUTO_INCREMENT
  , ADD UNIQUE KEY (`idc`)
  , ADD PRIMARY KEY
    (`mustahik_nik`
    ,`ins_provinces_code`
    ,`ins_cities_code`
    ,`ins_institution_types_code`
    ,`ins_institution_serial_no`
    ,`idc`
    )

如果有引用表的外键,则更改涉及更多。 (您是否想要在引用表的外键中添加额外的列?)

您想要达到的目标并不完全清楚。

【讨论】:

  • 我只知道唯一可以自动递增 .. 重要的是 .. 我想使用 SELECT LAST_INSERT_ID() 添加带有自动递增的 id .. 非常感谢@spencer7593
【解决方案2】:

是的,您可以添加主键,但在您的情况下,您需要删除 pk 然后添加新 pk,否则引擎会解释为您尝试添加多个 pk,多个 pk 与复合 pk 不同,可以添加复合pk,但不能添加多个pk

alter table xx drop primary key, add primary key(k1, k2, k3);

【讨论】:

  • 是的,谢谢@kiran kumar .. 但如果我放弃 .. 我还有很长的路要走 .. 因为外键太多了
猜你喜欢
  • 2011-07-02
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2020-04-20
相关资源
最近更新 更多