2015-10-18 34 views
1

我在讀一本關於電子商務的書。在這本書中,我發現瞭如下因素的SQL代碼:SQL外鍵

CREATE TABLE `orders` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `users_id` INT UNSIGNED NOT NULL, 
    `transaction_id` VARCHAR(45) NOT NULL, 
    `payment_status` VARCHAR(45) NOT NULL, 
    `payment_amount` INT UNSIGNED NOT NULL, 
    `date_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    INDEX `date_created` (`date_created` ASC), 
    INDEX `transaction_id` (`transaction_id` ASC), 
    CONSTRAINT `fk_orders_users1` 
     FOREIGN KEY (`id`) 
     REFERENCES `users` (`id`) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
) ENGINE = InnoDB DEFAULT CHARSET=utf8; 

書上說,該約束將防止出現「users_id」不匹配表中的「用戶」一個「身份證」的插入。通過閱讀代碼,我相信這本書是錯誤的,因爲我相信這段代碼會阻止插入一個「id」(在表中的「orders」),它與字段「id」不匹配)。我是對的?

對不起,英語不好。我不是美國人,並盡我所能...

+1

是的,你是對的。 – lad2025

+0

代碼應該讀取'外鍵(user_id)'而不是'外鍵(id)'。 –

+1

作爲說明:您可以聯繫可以在未來版本中進行更正的作者或發佈者。 –

回答

1

更正代碼:

CREATE TABLE `orders` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `users_id` INT UNSIGNED NOT NULL, 
    `transaction_id` VARCHAR(45) NOT NULL, 
    `payment_status` VARCHAR(45) NOT NULL, 
    `payment_amount` INT UNSIGNED NOT NULL, 
    `date_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    INDEX `date_created` (`date_created` ASC), 
    INDEX `transaction_id` (`transaction_id` ASC), 
    CONSTRAINT `fk_orders_users1` 
     FOREIGN KEY (`users_id`) 
     REFERENCES `users` (`id`) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
) ENGINE = InnoDB DEFAULT CHARSET=utf8; 
+0

感謝您的幫助! – yuridamata