【问题标题】:SQL FOREIGN KEY USAGE ? what does it really do ? and when it was needed?SQL 外键用法?它到底有什么作用?什么时候需要?
【发布时间】:2010-07-16 09:04:20
【问题描述】:

好的,我为我的示例制作了一个简单的数据库,有用户数据和用户公司的数据。

CREATE TABLE `users` (
  `UID` INT(25) NOT NULL AUTO_INCREMENT ,
  `username` VARCHAR(60) NOT NULL ,
  `password` VARCHAR(100) NOT NULL ,
  `ownername` VARCHAR(150) NOT NULL ,
  `userstatus` TINYINT(1) NOT NULL ,
  `userregistertime` DATETIME NOT NULL ,
  `userlastonline` DATETIME NOT NULL ,
  PRIMARY KEY (`UID`) ,
  INDEX `username` (`username` ASC) )
  ENGINE = InnoDB
  DEFAULT CHARACTER SET = utf8;

CREATE TABLE `company` (
  `CID` INT(25) NOT NULL AUTO_INCREMENT ,
  `UID` INT(25) NOT NULL ,
  `companyname` VARCHAR(60) NOT NULL ,
  `companyaddress` VARCHAR(255) NOT NULL ,
  `companyemail` VARCHAR(255) NULL DEFAULT NULL ,
  `companyphone` VARCHAR(20) NOT NULL ,
  `companyimage` VARCHAR(255) NULL DEFAULT NULL ,
  `companyyahoo` VARCHAR(255) NULL DEFAULT NULL ,
  `companytwitter` VARCHAR(255) NULL DEFAULT NULL ,
  `companykaskus` VARCHAR(255) NULL DEFAULT NULL ,
  `companyfacebook` VARCHAR(255) NULL DEFAULT NULL ,
  `companytype` TINYINT(1) NOT NULL DEFAULT '0' ,
  `companystatus` TEXT NULL DEFAULT NULL ,
  `companytemplate` TEXT NULL DEFAULT NULL ,
  `companyintroduction` TEXT NULL DEFAULT NULL ,
  `partnership` TINYINT(1) NOT NULL DEFAULT '0' ,
  PRIMARY KEY (`CID`) ,
  INDEX `ownername` (`UID` ASC) ,
  INDEX `companyname` (`companyname` ASC) ,
  CONSTRAINT `ownernamecompany`
    FOREIGN KEY (`UID` )
    REFERENCES `users` (`UID` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

1.为什么在我向用户表插入数据后(uid 是自动递增的)它没有更新我公司的 UID 表?

如果你有 php 知识,请看看我是如何插入它的。

$RegisterInsert1 = $dbConnect->prepare("INSERT INTO users (
`username`, `password`, `ownername`, `userregistertime`, `userlastonline`) VALUES (
:username, :password, :ownername, :userregistertime, :userlastonline)");
$RegisterInsert1->execute($RegisterData1); 

如您所见,我得到 UID = 1 ( auto ) 然后将用户名、密码、所有者名等插入到用户表中。但不知何故,我的公司 UID 没有更新。它应该是 UID = 1 然后是其余的 CID ( auto ) companyname null 等等。

2.我是否正确定义了外键用法?

3.请给我插入用户数据+公司数据的最佳示例,正确使用外国的正确用法。

我现在怎么样了

// INSERT USERS DB
$RegisterInsert1 = $dbConnect->prepare("INSERT INTO users (
`username`, `password`, `ownername`, `userregistertime`, `userlastonline`) VALUES (
:username, :password, :ownername, :userregistertime, :userlastonline)");
$RegisterInsert1->execute($RegisterData1);

// GET USERS GIVEN AUTO GENERATED UID
// QUESTION ? THIS one should be automated by foreign useage ?
$GetUid = $dbConnect->prepare("SELECT UID FROM users WHERE username = :username");
$GetUid->execute($RegisterData3);
$UserID = $GetUid->fetch();
$RegisterData2['UID'] = $UserID;

// INSERT COMPANY INFO + UID
$RegisterInsert2 = $dbConnect->prepare("INSERT INTO company (
`UID`,`companyphone`,`partnership`) VALUES (
:UID, :companyphone, :partnership)");
$RegisterInsert2->execute($RegisterData2);

【问题讨论】:

  • 如果你只写与问题 drct 相关的代码,你会得到更多的赞赏……
  • 当我将数据 olny 插入用户表时,我试图做的是从 UID.users 更新 UID.company。 UID.users 是自动增量的,它应该在增量时复制到 UID.company。所以我不必使用 // GET UserS GIVEN AUTO GENERATED UID 。希望你能理解。谢谢朋友。

标签: php sql mysql database database-design


【解决方案1】:

架构定义中的外键是 Company 表中的 UID 列。这指的是用户表中的单行。您可以通过添加外键约束来确保永远不会将无效的 UID 插入到 Company 表中...

ALTER TABLE COMPANY ADD FOREIGN KEY COMPANY_USER_FK (UID) REFERENCES USER(UID);

这将导致尝试将用户表中不存在的 UID 添加到公司名称中失败。您可以添加额外的功能,以便从 User 表中删除 User 会删除 Company 表中的所有匹配行,如下...

ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON DELETE CASCADE;

或者,如果用户的行存在于公司表中,您可以防止用户被删除...

ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON DELETE RESTRICT;

虽然它不适用于您的架构,但您也可以通过...级联更改用户表中的 UID。

ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON UPDATE CASCADE;

请注意,如果存储引擎为INNODB;,所有这些仅适用于 MySQL

【讨论】:

  • ALTER TABLE COMPANY ...等...在更新级联时参考用户(UID);这个。为什么它不更新?当我插入用户数据时,我的公司表仍然是空的。
  • ooooooooooooooooooooooooo 我看到没有插入级联。啊啊啊啊愚蠢的我。
【解决方案2】:

为什么在我向用户插入数据之后 表(uid是自动增量)它 不更新我的公司 UID 表?

SQL 不支持多重赋值,您需要按程序进行。您需要(至少)为每个表使用一个 INSERT 语句。

  1. INSERT INTOusers哪个 自动生成 UID 值;
  2. 捕获自动生成的值 UID;
  3. INSERT INTO 用户提供 捕获 UID 值。

FWIW SQL Server 2008 使用 OUTPUT 关键字使这很容易,即可以在 INSERT 语句中捕获自动生成的值(到暂存临时表)。在 MS Access 中,您可以在两个表之间创建一个 VIEW 和一个 JOIN 然后 INSERT INTO VIEW 和自动生成的值将自动出现在两个表中(仅适用于两个表 @987654334 @)。不知道mySQL有没有类似的功能。

【讨论】:

  • 是的,没有插入级联。只需更新级联:| .我只是注意到它。
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2010-10-15
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多