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:|。我刚刚注意到了。