2015-10-18 48 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