我想用外键创建一个mysql数据库。但是当我插入一些测试数据时,我注意到当我查看表tblcontact和tbladdress时,我的外键为null。我知道这是一个基本问题,但你能给出一些建议吗?
CREATE TABLE tblCustomers (
customerID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
vat VARCHAR(30) NOT NULL,
customerVisible varchar(1) NOT NULL DEFAULT 'T'
);
CREATE TABLE tblContact (
contactID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100),
phone VARCHAR(100),
customerID int,
CONSTRAINT FK_customerID FOREIGN KEY (customerID) REFERENCES tblCustomers(customerID)
);
CREATE TABLE tblAddress (
addressID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
street VARCHAR(100),
houseNumber VARCHAR(15),
city VARCHAR (100),
country VARCHAR (100),
customerID int,
CONSTRAINT FK_customerIDa FOREIGN KEY (customerID) REFERENCES tblCustomers(customerID)
);
INSERT INTO tblCustomers (firstname, lastname,vat) VALUES ("John","Doe","UV45856855");
INSERT INTO tblContact (email, phone) VALUES ("0000001","Johndoe@gmail.com");
INSERT INTO tblAddress (street,housenumber,city,country) VALUES ("berkenlaan","1a","Harelbeke","Belgie");
答案 0 :(得分:0)
其中一个原因可能是您的默认数据库引擎是MyISAM。 在创建数据库时将其更改为InnoDB,或使用phpmyadmin手动将其更改为InnoDB。
答案 1 :(得分:0)
您误解了外键的概念。外键是用于将两个表链接在一起的键。因此,为了将特定行与其父行相关联,您应该输入其引用(父键的主键)儿童。
它不是自动的..您必须手动输入customerId
中tblCustomer
的{{1}}和tblAddress
以包含依赖项。
你没有在你的代码中这样做..这就是为什么你得到null。 mysql如何知道您放入tblContact
和tblAddress
的数据与特定客户有关?
如果您希望自动执行此操作,可以使用tblContact
创建触发器。
实施例: -
LAST_INSERT_ID()
同样适用于CREATE TRIGGER tblAddress_auto_insert AFTER INSERT ON `tblAddress`
FOR EACH ROW
BEGIN
INSERT INTO tblAddress (customerID) VALUES (LAST_INSERT_ID());
END;
。
HTH
答案 2 :(得分:0)
您没有在tblcontact和tbladdress的引用列中插入任何值。这些列不会自动填充。你可以试试这个:
INSERT INTO tblCustomers (firstname, lastname,vat)
VALUES ("John","Doe","UV45856855");
INSERT INTO tblContact (customerID,email, phone)
VALUES ((SELECT DISTINCT LAST_INSERT_ID() FROM tblCustomers), "0000001","Johndoe@gmail.com");
INSERT INTO tblAddress (customerID,street,housenumber,city,country)
VALUES ((SELECT DISTINCT LAST_INSERT_ID() FROM tblCustomers), "berkenlaan","1a","Harelbeke","Belgie");
另一种方法可以是您正在使用的服务器端语言。 您可以创建第一个插入的查询对象,然后可以找到其最后插入的值。