我将外键设为NULL
,有人告诉我,这是因为我没有设置它的值,但我认为当我将它引用到主键时它应该采用该主键值。
这是我用来创建表然后插入的代码:
sql="Create Table if not exists Machine "+
"( InstallationDate varchar(100) not null , Machine_id int ,FOREIGN KEY (Machine_id) REFERENCES machineInfo(Machineid),"+"Protocol_ID int ,"+
"FOREIGN KEY (Protocol_ID) REFERENCES communicationprotocol(ProtocolID),Port_ID int ,FOREIGN KEY (Port_ID)"+
" REFERENCES porttype(PortID) "+
",SerialConfigurationID int, NetworkConfigurationID int) ENGINE=InnoDB";
stmt.execute(sql);
System.out.println("Table Created"+"\n");
sql="Insert into Machine (InstallationDate) values(?)";
PreparedStatement pstmtmain=conn.prepareStatement(sql);
pstmtmain.setString(1, Installationdate);
pstmtmain.execute();
请帮我改正一下。
答案 0 :(得分:1)
您对SQL和数据库的工作方式存在一些严重的误解。外键是一个约束,这意味着:此处使用的值应该是NULL
,或者它们应该是目标表的主键(或唯一键)中的值之一。
目标machineInfo
表可以包含数百,数千,数百万或者 - 如果你很幸运 - 数十亿台机器。您认为数据库如何决定在执行插入时使用machine_id
:
Insert into Machine (InstallationDate) values(?)
它不能。 您需要告诉它使用哪个值,如果您没有,那么服务器只会使用NULL
来表示 unknown / not set 。如果您指定了machineInfo
表中不存在的值,则插入将失败,因为未满足约束。
所以使用:
Insert into Machine (machine_id, InstallationDate) values(?, ?)
并指定需要使用的machine_id
。
答案 1 :(得分:0)
您是否尝试避免外键中的空值?
CREATE TABLE IF NOT EXISTS Machine (
InstallationDate VARCHAR(100) NOT NULL ,
Machine_id INT NOT NULL ,
Protocol_ID INT NOT NULL ,
Port_ID INT NOT NULL ,
SerialConfigurationID INT ,
NetworkConfigurationID INT ,
FOREIGN KEY (Machine_id) REFERENCES machineInfo(Machineid) ,
FOREIGN KEY (Protocol_ID) REFERENCES communicationprotocol(ProtocolID),
FOREIGN KEY (Port_ID) REFERENCES porttype(PortID)
) ENGINE=InnoDB
另一方面,如果您不想要空值,则需要插入外键的值。
INSERT INTO Machine (InstallationDate, Machine_id, Protocol_ID, Port_ID) VALUES (?, ?, ?, ?)