2017-07-26 200 views
0

我有一個包含三個表的數據庫。 表認證包括以下內容:正確創建關係數據庫

+----------+-----------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+-----------------+------+-----+---------+----------------+ 
| id  | int(6) unsigned | NO | PRI | NULL | auto_increment | 
| userid | varchar(30)  | NO |  | NULL |    | 
| password | varchar(30)  | NO |  | NULL |    | 
| role  | varchar(20)  | NO |  | NULL |    | 
| email | varchar(50)  | YES |  | NULL |    | 
+----------+-----------------+------+-----+---------+----------------+ 

登錄包含以下內容:

+--------------+-----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+-----------------+------+-----+---------+----------------+ 
| id   | int(6) unsigned | NO | PRI | NULL | auto_increment | 
| TimeLoggedIn | text   | NO |  | NULL |    | 
| sessionid | varchar(255) | NO |  | NULL |    | 
+--------------+-----------------+------+-----+---------+----------------+ 

而且活動時間:

+----------+-----------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+----------+-----------------+------+-----+---------+-------+ 
| id  | int(6) unsigned | NO | PRI | NULL |  | 
| Torrents | mediumtext  | NO |  | NULL |  | 
+----------+-----------------+------+-----+---------+-------+ 

還有就是ID在認證的ID字段之間的關係其他表格。

我需要在Activity中添加多行,併爲每個id使用幾個Torrents值。不幸的是,當我嘗試添加一個新行的值複製ID具有:

INSERT INTO `Activity` (`id`, `Torrents`) VALUES ('1', 'dssfsdffdsffs'); 

它給我的錯誤:#1062 - Duplicate entry '1' for key 'PRIMARY'

如何解決這個問題呢?我是如何創建表錯誤的?

我讀過以下明顯重複的問題:

  1. #1062 - Duplicate entry for key 'PRIMARY'

但是,雖然它說,刪除它作爲我的主鍵,MySQL的didnt允許我,除非我犯了創建關係它是主鍵。

+0

這不是應該發生什麼? – Strawberry

+0

@Strawberry你的意思是我不能有包含重複'id'值的行嗎? – Droidzone

+1

如果它是主鍵,則不行。 id和torrents一起形成一個自然的PK,或者你有一個surrogate activity_id列。如果您選擇代理鍵,那麼通常會在其餘列上形成一個UNIQUE KEY。 – Strawberry

回答

1

您不能通過將主鍵引用到主鍵來啓動一對多關係。這將是一對一的關係。

在您的登錄和活動表中,您都需要有一個外鍵來引用認證ID。例如:

CONSTRAINT `FK_Login` FOREIGN KEY (`AuthenticationID`) REFERENCES `Authentication` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE 
+0

那麼這個新字段AuthenticationID的屬性應該是什麼? – Droidzone

+1

它應該與您想要引用的密鑰相同。因此,如果您的Authentication.ID是int(6)unsigned NOT NULL,則Login和Activity中的外鍵也必須是int(6)unsigned NOT NULL。 –

+0

@Droidzone請注意,括號中的數字在MySQL中幾乎沒有意義,所以通常可以省略參數。 – Strawberry