在我的test.sql中有以下语句:
[code="java"]
CREATE TABLE invoice_item (
id int NOT NULL auto_increment,
description varchar(50) NOT NULL,
FOREIGN KEY (payment_id) REFERENCES payment(id),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='This table stores invoice item information';
CREATE TABLE payment (
id int NOT NULL auto_increment,
description varchar(255) NOT NULL,
total double NOT NULL,
invoice_item_id int,
FOREIGN KEY (invoice_item_id) REFERENCES invoice_item(id),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='This table stores payment information';[/code]
生成invoice_item的时候出错,因为payment还没有产生。
这样的相互引用,我难道要用alter table吗?
建议修改表
一般的原则是 1对1关联外键在那边都行,1对多管理外键再多方,多对多关联添加一个关联表
再加一张关系表吧,create table invoice_payment(invoice_item_id int not null,payment_id int not null),先插payment,invoice_item的数据,再插关系表的数据。
明显就是表结构设计不合理
如果在不能改表的情况下,lz的这两张表必须先存payment,因为payment表中的外键invoice_item_id允许为空,也就是说可以在invoice_item表未创建前先赋空值,然后创建invoice_item表的记录,最后更新这个字段
[code="java"]
invoice_item_id int,
FOREIGN KEY (invoice_item_id) REFERENCES invoice_item(id),
[/code]
如果不能为空就只好考虑改表结构了