如何设置外键

时间:2014-08-06 19:19:53

标签: mysql jdbc

我将外键设为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();

请帮我改正一下。

2 个答案:

答案 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 (?, ?, ?, ?)