2008-11-04 53 views
82

在課堂上,我們都是'學習'數據庫,每個人都在使用Access。無聊的是,我正在嘗試做其他課程,但是使用MySQL的原始SQL命令而不是使用Access。如何在MySQL中創建關係

我已經設法創建數據庫和表,但現在如何在兩個表之間建立關係?

如果我有我的兩個表是這樣的:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id) 
) 

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
) 

如何創建兩個表之間的 '關係'?我希望每個賬戶都被分配一個customer_id(以表明誰擁有它)。

+26

「我拒絕學習訪問,我將學習一個真正的數據庫引擎:MySQL的」這是精神!恭喜= D – Metafaniel 2015-08-24 18:10:05

+1

請注意,外鍵約束不實現關係,它們實現完整性。 account_id中的account_id和customer_id之間的關聯實現了各個實體之間的關係。 – reaanb 2015-10-05 18:25:05

+1

「這就是精神!」,只要它是InnoDB的MySQL,而不是MyISAM。另外,postgreqsl還有一些值得關注的MySQL有趣的功能。 – jgmjgm 2016-08-23 15:53:04

回答

82

如果表是InnoDB的,你可以這樣創建:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB; 

您必須指定的表是InnoDB的,因爲MyISAM引擎不支持外鍵。查看here瞭解更多信息。

9

通過ehogue添加到評論上,你應該使兩個表上的鍵的大小匹配。而不是

customer_id INT(4) NOT NULL , 

使其

customer_id INT(10) NOT NULL , 

,並確保在客戶表中的INT列,爲int(10)也。

+1

好點,我沒有看到字段的大小。 – 2008-11-04 00:38:53

62

爲ehogue說,把這個在您的CREATE TABLE

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

另外,如果你已經創建表,使用ALTER TABLE命令:

ALTER TABLE `accounts` 
    ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE; 

一個很好的方式開始學習這些命令使用的是MySQL GUI Tools,它爲您提供了一個更「可視」的界面來處理數據庫。這一點(通過Access的方法)的真正好處是,通過GUI設計表格後,它會顯示它將要運行的SQL,因此您可以從中學習。

6

某些MySQL引擎支持外鍵。例如,InnoDB可以基於外鍵建立約束。如果您嘗試刪除一個表中具有其他依賴項的表中的條目,則刪除將失敗。

如果您在MySQL中使用的表類型(如MyISAM)不支持外鍵,則除了圖表和查詢之外,不要鏈接表格。

例如,在查詢你在select語句連接兩個表聯接:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field); 
1

一個你必須知道的規則是,你要引用表中列有要與 具有相同的數據類型引用表。 2如果你決定使用mysql,你必須使用InnoDB Engine,因爲根據你的問題,這是支持你想在mysql中實現的引擎。

貝婁是代碼嘗試它雖然第一個回答這個問題的人 他們100%提供了很好的答案,請考慮他們所有。

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id) 
)ENGINE=InnoDB; 

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
    PRIMARY KEY (account_id), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 
2

這裏有一些資源,這將有助於上手:http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabasehttp://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

也爲其他人說,使用GUI - 嘗試下載並安裝XAMPP(或WAMP),它運行服務器軟件( Apache和mySQL)在您的計算機上。 然後,當您在瀏覽器中導航到// localhost時,請選擇PHPMyAdmin以可視方式開始使用mySQL數據庫。如上所述,使用innoDB允許你按照你的要求建立關係。使它更容易看到你在用數據庫表做什麼。請記住在完成時停止Apache和mySQL服務 - 這些可能會打開端口,從而使您受到黑客攻擊/惡意威脅。

10
CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT, 
    customer_id INT(4) NOT NULL , 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
    PRIMARY KEY (account_id) 
) 

and 

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
) 

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it). 

你必須問自己,這是一對一的關係還是一對多的關係。也就是說,每個賬戶都有一個客戶,每個客戶都有一個賬戶。或者會有沒有帳戶的客戶。你的問題意味着後者。

如果您想要有嚴格的1對1關係,只需合併這兩個表。

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(20) NOT NULL, 
    address VARCHAR(20) NOT NULL, 
    city VARCHAR(20) NOT NULL, 
    state VARCHAR(20) NOT NULL, 
    account_type ENUM('savings', 'credit') NOT NULL, 
    balance FLOAT(9) NOT NULL, 
) 

在另一種情況下,創建兩個表之間關係的正確方法是創建關係表。

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL, 
    account_id INT NOT NULL, 
    PRIMARY KEY (customer_id, account_id) 
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade, 
    FOREIGN KEY account_id references accounts (account_id) on delete cascade 
} 

然後,如果你有一個CUSTOMER_ID和所需的帳戶信息,你加入的customersaccounts和帳戶:

SELECT a.* 
    FROM customersaccounts ca 
     INNER JOIN accounts a ca.account_id=a.account_id 
      AND ca.customer_id=mycustomerid; 

因爲索引,這將是令人眼花繚亂的快。

你也可以創建一個視圖,讓你合併customersaccounts表的效果,同時保持它們分開

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca 
     INNER JOIN accounts a ON ca.account_id=a.account_id 
     INNER JOIN customers c ON ca.customer_id=c.customer_id;