SQL FOREIGN KEY USAGE? что это действительно делает? а когда это было нужно? - PullRequest
2 голосов
/ 16 июля 2010

хорошо, я делаю простую базу данных для моего примера, есть данные пользователей и данные компании пользователя.

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 (авто), затем имя пользователя, пароль, имя владельца и т. Д. Вставляются в таблицу пользователей. но почему-то UID моей компании не обновляется. это должен быть UID = 1, тогда остальное CID (авто), название компании, ноль, и т. д. ноль.

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);

Ответы [ 2 ]

3 голосов
/ 16 июля 2010

Внешний ключ в определении схемы - это столбец UID в таблице Company. Это относится к одной строке в таблице Users. Вы можете убедиться, что неверный UID никогда не будет вставлен в таблицу Company, добавив ограничение внешнего ключа ...

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

, и это приведет к неудаче попыток добавить UID в имя компании, которого нет в таблице User. Можно добавить дополнительные функции, чтобы при удалении пользователя из таблицы «Пользователь» удалялись все соответствующие строки в таблице «Компания» следующим образом ...

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

или вы можете запретить удаление пользователей, если для них есть строки в таблице компании, с помощью ...

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

Хотя это не относится к вашей схеме, вы также можете каскадно вносить изменения в UID в таблице Users с помощью ...

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

Обратите внимание, что все это работает только в MySQL, если механизм хранения INNODB;

0 голосов
/ 16 июля 2010

почему после того, как я вставляю данные пользователям table (uid - автоинкремент) не обновляет таблицу UID моей компании?

SQL не поддерживает множественное присваивание, это необходимо сделать процедурно. Вам нужно использовать (как минимум) один оператор INSERT на таблицу.

  1. INSERT INTO users который автоматически генерирует значение UID;
  2. Захват автоматически сгенерированных значений для UID;
  3. INSERT INTO пользователей, предоставляющих захваченное UID значение (я).

FWIW SQL Server 2008 облегчает это с помощью ключевого слова OUTPUT, то есть автоматически сгенерированные значения могут быть записаны (в промежуточную временную таблицу) внутри оператора INSERT. В MS Access можно создать VIEW с JOIN между двумя таблицами, тогда INSERT INTO VIEW и значение автоматической генерации будут автоматически появляться в обеих таблицах (работает только для двух таблиц * 1028) *). Я не знаю, имеет ли MySQL аналогичные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...