使用外键在mysql中工作

时间:2015-03-21 09:54:32

标签: mysql

我想用外键创建一个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");

3 个答案:

答案 0 :(得分:0)

其中一个原因可能是您的默认数据库引擎是MyISAM。 在创建数据库时将其更改为InnoDB,或使用phpmyadmin手动将其更改为InnoDB。

答案 1 :(得分:0)

您误解了外键的概念。外键是用于将两个表链接在一起的键。因此,为了将特定行与其父行相关联,您应该输入其引用(父键的主键)儿童。

它不是自动的..您必须手动输入customerIdtblCustomer的{​​{1}}和tblAddress以包含依赖项。

你没有在你的代码中这样做..这就是为什么你得到null。 mysql如何知道您放入tblContacttblAddress的数据与特定客户有关?

如果您希望自动执行此操作,可以使用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");

另一种方法可以是您正在使用的服务器端语言。 您可以创建第一个插入的查询对象,然后可以找到其最后插入的值。