2011-04-18 38 views
0

我有三個表。用外鍵修改表

Person (id, FirstName, LastName, BirthDate) 
Contact (id, contact, type) 
PersonContact(Person_id, Contact_id) 

正如你可以看到PERSON_ID從Person表正在添加中PersonContact表 而CONTACT_ID從聯繫表中PersonContact表正在添加

我想寫應與PersonContact表PERSON_ID列的查詢以Person Table的id列作爲外鍵。

並與聯繫表的ID列的外鍵

+0

只是爲了澄清,你想添加外鍵約束到PersonContact的權利?因此,除非引用的記錄存在於Person和Contact中,否則您不能向PersonContact添加記錄? – Kendrick 2011-04-18 15:31:31

+0

@Kendrick:是的你說的對.. – Awan 2011-04-19 04:58:16

回答

3

PersonContact的CONTACT_ID列這應該回答的問題

CREATE TABLE IF NOT EXISTS `person_contact` (
    `contact_id` int(11) NOT NULL, 
    `person_id` int(11) NOT NULL, 
    PRIMARY KEY (`contact_id`,`person_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


ALTER TABLE `person_contact` 
    ADD CONSTRAINT `person_contact_ibfk_2` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`), 
    ADD CONSTRAINT `person_contact_ibfk_1` FOREIGN KEY (`contact_id`) REFERENCES `contact` (`id`); 
+1

它給了我以下錯誤:'#1005 - 無法創建表'chdp。#sql-305_45'(errno:150)(Details...)' – Awan 2011-04-19 05:07:16

+0

爲了有一個關係引擎(外鍵和完整性約束),你的mysql服務器必須激活innodb引擎。 而你創建的表必須使用這個引擎(默認情況下,mysql使用myisam引擎,它不是關係型的)。 'CREATE TABLE IF NOT EXISTS person_contact( CONTACT_ID INT(11)NOT NULL, 爲person_id INT(11)NOT NULL, PRIMARY KEY(CONTACT_ID,爲person_id) )ENGINE = InnoDB的默認字符集= LATIN1;' 指定'ENGINE = InnoDB'如上所示每個表 – 2011-04-21 15:04:13

0

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

alter PersonContact add foreign key(PersonID) references Person(ID) 

要選擇,你這樣做:

select * 
    from Person 
     inner join PersonContact on(Person.ID=PersonContact.PersonID) 
+0

任何人都可以確認這是否有效?當我嘗試它時,它抱怨'Key列'PersonID'不存在於表中' – puk 2012-04-29 02:16:59

+0

它存在於表中嗎?在上面的情況中,他的專欄命名不同,可能會導致混淆。此外,您必須啓用innodb引擎,並將其應用於表格。儘管如此,我傾向於採取面值的錯誤信息。如果您經過雙重檢查後仍有問題,請在您的特定場景中發佈新問題。 – Kendrick 2012-04-29 20:06:05

0

這裏是我的$ 0.02值得提醒的T-SQL方面

選擇名字,姓氏,出生日期 從人員P 加入PersonContact PC上 p.id = pc.Person_id

選擇聯繫人,類型 從聯繫人c 加入PersonContact pc ON c.id = pc.Person_id