Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL外键用法?它真正的作用是什么?什么时候需要?_Php_Sql_Mysql_Database_Database Design - Fatal编程技术网

Php SQL外键用法?它真正的作用是什么?什么时候需要?

Php SQL外键用法?它真正的作用是什么?什么时候需要?,php,sql,mysql,database,database-design,Php,Sql,Mysql,Database,Database Design,好的,我正在制作一个简单的数据库,例如,有用户数据和用户公司的数据 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 , `

好的,我正在制作一个简单的数据库,例如,有用户数据和用户公司的数据

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),然后是username、pasword、ownername等。但不知何故,我的公司UID没有更新。它应该是UID=1,然后是其余的CID(自动)companyname null,etc 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);

架构定义中的外键是Company表中的UID列。这是指用户表中的一行。通过添加外键约束,可以确保从不将无效UID插入公司表中

ALTER TABLE COMPANY ADD FOREIGN KEY COMPANY_USER_FK (UID) REFERENCES USER(UID);
这将导致将用户表中不存在的UID添加到公司名称中的尝试失败。您可以添加额外的功能,以便从用户表中删除用户会删除公司表中的所有匹配行,如下所示

ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON DELETE CASCADE;
或者,如果公司表中存在用户的行,则可以通过以下方式防止删除用户

ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON DELETE RESTRICT;
ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON UPDATE CASCADE;
虽然它不适用于您的模式,但您也可以通过以下方式对Users表中的UID进行级联更改

ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON DELETE RESTRICT;
ALTER TABLE COMPANY ...etc... REFERENCES USER(UID) ON UPDATE CASCADE;
注意,如果存储引擎是
INNODB,所有这些只在MySQL上起作用

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

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

  • 插入
    用户
    哪个 自动生成
    UID
  • 捕获的自动生成值
    UID
  • 插入提供
    捕获的
    UID

  • FWIW SQL Server 2008通过一个
    输出
    关键字简化了这一过程,即可以在
    插入
    语句中捕获自动生成的值(到临时表中)。在MS Access中,您可以创建一个
    视图
    ,在两个表之间创建一个
    连接
    ,然后
    插入
    视图
    ,自动生成值将自动显示在两个表中(仅适用于两个表
    视图
    )。我不知道mySQL是否有类似的功能。

    U将得到更多的支持。。如果您只编写与问题drct相关的代码,那么当我将olny数据插入到users表时,我试图做的是从UID.users更新UID.company。UID.users是自动递增的,递增时应复制到UID.company。因此,我不必使用//为用户提供自动生成的UID。希望你能理解。谢谢,伙计。ALTER TABLE公司……等等。。。在更新级联上引用用户(UID);这个。为什么它不更新?当我插入用户数据时,我的公司表仍然是空的。阿卡卡卡。愚蠢的我。是的,没有。只需更新CASCADE:|。我刚刚注意到了。