我正在用MySQL Workbench做一个小型数据库。我有一个名为“ Immobili”的主表,它具有由四列组成的主键:(Comune,Via,Civico,Immobile)。
现在,我还有其他三个表,它们具有相同的主键(Comune,Via,Civico,Immobile),但是这些字段也引用了表Immobili。
第一个问题:我可以同时创建主键还是外键吗?
第二个问题:当我尝试导出更改时,它说:在服务器中执行SQL脚本
CREATE TABLE IF NOT EXISTS dbimmobili
.Condoni
(
ComuneImmobile
VARCHAR(50) NOT NULL , ViaImmobile
VARCHAR(50) NOT NULL , CivicoImmobile
VARCHAR(5) NOT NULL , InternoImmobile
VARCHAR(3) NOT NULL , ProtocolloNumero
VARCHAR(15) NULL , DataRichiestaSanatoria
DATE NULL , DataSanatoria
DATE NULL , SullePartiEsclusive
TINYINT(1) NULL , SullePartiComuni
TINYINT(1) NULL , OblazioneInEuro
DOUBLE NULL , TecnicoOblazione
VARCHAR(45) NULL , TelefonoTecnico
VARCHAR(15) NULL , INDEX ComuneImmobile
(ComuneImmobile
ASC) , INDEX ViaImmobile
(ViaImmobile
ASC) , INDEX CivicoImmobile
(CivicoImmobile
ASC) , INDEX InternoImmobile
(InternoImmobile
ASC) ,
PRIMARY KEY (ComuneImmobile
, ViaImmobile
, CivicoImmobile
, InternoImmobile
) ,
CONSTRAINT ComuneImmobile
FOREIGN KEY (ComuneImmobile
) REFERENCES dbimmobili
.Immobile
(ComuneImmobile
) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT ViaImmobile
FOREIGN KEY (ViaImmobile
) REFERENCES dbimmobili
.Immobile
(ViaImmobile
) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT CivicoImmobile
FOREIGN KEY (CivicoImmobile
) REFERENCES dbimmobili
.Immobile
(CivicoImmobile
) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT InternoImmobile
FOREIGN KEY (InternoImmobile
) REFERENCES dbimmobili
.Immobile
(InternoImmobile
) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE = InnoDB 显示引擎状态:
表dbimmobili / valutazionimercato的外键约束中的错误:
在被引用的表中找不到索引,在该索引中被引用的列显示为第一列,或者表和被引用的表中的列类型因约束而不匹配。请注意,在使用> = InnoDB-4.1.12创建的表中,ENUM和SET的内部存储类型已更改,并且新表中的此类列不能引用旧表中的此类列。
我在哪里做错了?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
创建外键约束时,MySQL在引用表和被引用表上都需要一个可用的索引。如果不存在引用表上的索引,则会自动创建索引,但需要手动创建引用表上的索引(Source)。您的似乎丢失了。
测试用例:
CREATE TABLE tbl_a ( id int PRIMARY KEY, some_other_id int, value int ) ENGINE=INNODB; Query OK, 0 rows affected (0.10 sec)
CREATE TABLE tbl_b ( id int PRIMARY KEY, a_id int, FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id) ) ENGINE=INNODB; ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150) 但是,如果我们在上添加索引some_other_id:
CREATE INDEX ix_some_id ON tbl_a (some_other_id); Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0
CREATE TABLE tbl_b ( id int PRIMARY KEY, a_id int, FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id) ) ENGINE=INNODB; Query OK, 0 rows affected (0.06 sec) 在大多数情况下,这通常不是问题,因为被引用字段通常是被引用表的主键,并且主键会自动索引。来源:stack overflow