Maison base de données tutoriel mysql 为mysql数据表添加外键(三)总结

为mysql数据表添加外键(三)总结

Jun 07, 2016 pm 03:46 PM
innodb mysql 外键 总结 支持 数据表 添加

InnoDB也支持外键约束。InnoDB中对外键约束定义的语法看起来如下: [CONSTRAINT symbol ] FOREIGN KEY [ id ] ( index_col_name , ...) REFERENCES tbl_name ( index_col_name , ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {

InnoDB也支持外键约束。InnoDB中对外键约束定义的语法看起来如下:

<span>[CONSTRAINT <em>symbol</em>] FOREIGN KEY [<em>id</em>] (<em>index_col_name</em>, ...)</span>
Copier après la connexion
<span><span>    </span>REFERENCES <em>tbl_name</em> (<em>index_col_name</em>, ...)</span>
Copier après la connexion
Copier après la connexion
<span><span>    </span>[ON DELETE {RESTRICT | <font>CASCADE</font> | SET NULL | NO ACTION}]</span>
Copier après la connexion
Copier après la connexion
<span><span>    </span>[ON UPDATE {RESTRICT | <font>CASCADE</font> | SET NULL | NO ACTION}]</span>
Copier après la connexion
Copier après la connexion

外键定义服从下列情况:

·         所有tables必须是InnoDB型,它们不能是临时表。

·         在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。

·         在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。

·         不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度。

·         如果CONSTRAINTsymbol被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。

InnoDB拒绝任何试着在子表创建一个外键值而不匹配在父表中的候选键值的INSERT或UPDATE操作。一个父表有一些匹配的行的子表,InnoDB对任何试图更新或删除该父表中候选键值的UPDATE或DELETE操作有所动作,这个动作取决于用FOREIGN KEY子句的ON UPDATE和ON DETETE子句指定的referential action。当用户试图从一个父表删除或更新一行之时,且在子表中有一个或多个匹配的行,InnoDB根据要采取的动作有五个选择:

·         CASCADE: 从父表删除或更新且自动删除或更新子表中匹配的行。ON DELETE CASCADE和ON UPDATE CASCADE都可用。在两个表之间,你不应定义若干在父表或子表中的同一列采取动作的ON UPDATE CASCADE子句。

·         SET NULL: 从父表删除或更新行,并设置子表中的外键列为NULL。如果外键列没有指定NOT NULL限定词,这就是唯一合法的。ON DELETE SET NULL和ON UPDATE SET NULL子句被支持。

·         NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新操作。

·         RESTRICT: 拒绝对父表的删除或更新操作。NO ACTION和RESTRICT都一样,删除ON DELETE或ON UPDATE子句。(一些数据库系统有延期检查,并且NO ACTION是一个延期检查。在MySQL中,外键约束是被立即检查的,所以NO ACTION和RESTRICT是同样的)。

·         SET DEFAULT: 这个动作被解析程序识别,但InnoDB拒绝包含ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT子句的表定义。

当父表中的候选键被更新的时候,InnoDB支持同样选择。选择CASCADE,在子表中的外键列被设置为父表中候选键的新值。以同样的方式,如果在子表更新的列参考在另一个表中的外键,更新级联。

注意,InnoDB支持外键在一个表内引用,在这些情况下,子表实际上意味这在表内附属的记录。

InnoDB需要对外键和被引用键的索引以便外键检查可以快速进行且不需要一个表扫描。对外键的索引被自动创建。这是相对于一些老版本,在老版本中索引必须明确创建,否则外键约束的创建会失败。

在InnoDB内,外键里和被引用列里相应的列必须有类似的内部数据类型,以便它们不需类型转换就可被比较。整数类型的大小和符号必须相同。字符串类型的长度不需要相同。如果你指定一个SET NULL动作,请确认你没有在子表中宣告该列为为NOT NULL

如果MySQL从CREATE TABLE语句报告一个错误号1005,并且错误信息字符串指向errno 150,这意思是因为一个外键约束被不正确形成,表创建失败。类似地,如果ALTER TABLE失败,且它指向errno 150, 那意味着对已变更的表,外键定义会被不正确的形成。你可以使用SHOW INNODB STATUS来显示一个对服务器上最近的InnoDB外键错误的详细解释。

注释:InnoDB不对那些外键或包含NULL列的被引用键值检查外键约束。

对SQL标准的背离:如果在父表内有数个行,其中有相同的被引用键值,然后InnoDB在外键检查中采取动作,就仿佛其它有相同键值的父行不存在一样。例如,如果你已定义一个RESTRICT类型的约束,并且有一个带数个父行的子行,InnoDB不允许任何对这些父行的删除。

居于对应外键约束的索引内的记录,InnoDB通过深度优先选法施行级联操作。

对SQL标准的背离: 如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新相同的表,之前在级联过程中该表一被更新过,它就象RESTRICT一样动作。这意味着你不能使用自引用ON UPDATE CASCADE或者ON UPDATE SET NULL操作。这将阻止级联更新导致的无限循环。另一方面,一个自引用的ON DELETE SET NULL是有可能的,就像一个自引用ON DELETE CASCADE一样。级联操作不可以被嵌套超过15层深。

对SQL标准的背离: 类似一般的MySQL,在一个插入,删除或更新许多行的SQL语句内,InnoDB逐行检查UNIQUE和FOREIGN KEY约束。按照SQL的标准,默认的行为应被延迟检查,即约束仅在整个SQL语句被处理之后才被检查。直到InnoDB实现延迟的约束检查之前,一些事情是不可能的,比如删除一个通过外键参考到自身的记录。

注释:当前,触发器不被级联外键的动作激活。

一个通过单列外键联系起父表和子表的简单例子如下:

<span>CREATE TABLE parent(id INT NOT NULL,</span>
Copier après la connexion
<span><span>                    </span>PRIMARY KEY (id)</span>
Copier après la connexion
<span>) TYPE=INNODB;</span>
Copier après la connexion
Copier après la connexion
<span>CREATE TABLE child(id INT, parent_id INT,</span>
Copier après la connexion
<span><span>                   </span>INDEX par_ind (parent_id),</span>
Copier après la connexion
<span><span>                   </span>FOREIGN KEY (parent_id) REFERENCES parent(id)</span>
Copier après la connexion
<span><span>                     </span>ON DELETE <font><font>CASCADE</font></font></span>
Copier après la connexion
<span>) TYPE=INNODB;</span>
Copier après la connexion
Copier après la connexion

如下是一个更复杂的例子,其中一个product_order表对其它两个表有外键。一个外键引用一个product表中的双列索引。另一个引用在customer表中的单行索引:

<span>CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,</span>
Copier après la connexion
<span><span>                      </span>price DECIMAL,</span>
Copier après la connexion
<span><span>                      </span>PRIMARY KEY(category, id)) TYPE=INNODB;</span>
Copier après la connexion
<span>CREATE TABLE customer (id INT NOT NULL,</span>
Copier après la connexion
<span><span>                      </span>PRIMARY KEY (id)) TYPE=INNODB;</span>
Copier après la connexion
<span>CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,</span>
Copier après la connexion
<span><span>                      </span>product_category INT NOT NULL,</span>
Copier après la connexion
<span><span>                      </span>product_id INT NOT NULL,</span>
Copier après la connexion
<span><span>                      </span>customer_id INT NOT NULL,</span>
Copier après la connexion
<span><span>                      </span>PRIMARY KEY(no),</span>
Copier après la connexion
<span><span>                      </span>INDEX (product_category, product_id),</span>
Copier après la connexion
<span><span>                      </span>FOREIGN KEY (product_category, product_id)</span>
Copier après la connexion
<span><span>                        </span>REFERENCES product(category, id)</span>
Copier après la connexion
<span><span>                        </span>ON UPDATE <font>CASCADE</font> ON DELETE RESTRICT,</span>
Copier après la connexion
<span><span>                      </span>INDEX (customer_id),</span>
Copier après la connexion
<span><span>                      </span>FOREIGN KEY (customer_id)</span>
Copier après la connexion
<span><span>   </span><span>                     </span>REFERENCES customer(id)) TYPE=INNODB;</span>
Copier après la connexion

InnoDB允许你用ALTER TABLE往一个表中添加一个新的外键约束:

<span>ALTER TABLE yourtablename</span>
Copier après la connexion
<span><span>    </span>ADD [CONSTRAINT <em>symbol</em>] FOREIGN KEY [<em>id</em>] (<em>index_col_name</em>, ...)</span>
Copier après la connexion
<span><span>    </span>REFERENCES <em>tbl_name</em> (<em>index_col_name</em>, ...)</span>
Copier après la connexion
Copier après la connexion
<span><span>    </span>[ON DELETE {RESTRICT | <font>CASCADE</font> | SET NULL | NO ACTION}]</span>
Copier après la connexion
Copier après la connexion
<span><span>    </span>[ON UPDATE {RESTRICT | <font>CASCADE</font> | SET NULL | NO ACTION}]</span>
Copier après la connexion
Copier après la connexion

记住先创建需要的索引。你也可以用ALTER TABLE往一个表添加一个自引用外键约束。

InnoDB也支持使用ALTER TABLE来移除外键:

<span>ALTER TABLE <em>yourtablename</em> DROP FOREIGN KEY <em>fk_symbol</em>;</span>
Copier après la connexion

当年创建一个外键之时,如果FOREIGN KEY子句包括一个CONSTRAINT名字,你可以引用那个名字来移除外键。另外,当外键被创建之时,fk_symbol值被InnoDB内部保证。当你想要移除一个外键之时,要找出标记,请使用SHOW CREATE TABLE语句。例子如下:

<span>mysql> <strong>SHOW CREATE TABLE ibtest<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="11" unitname="C">11c</chmetcnv>/G</strong></span>
Copier après la connexion
<span>*************************** 1. row ***************************</span>
Copier après la connexion
<span><span>       </span>Table: ibtest<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="11" unitname="C">11c</chmetcnv></span>
Copier après la connexion
<span>Create Table: CREATE TABLE `ibtest<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="11" unitname="C">11c</chmetcnv>` (</span>
Copier après la connexion
<span><span>  </span>`A` int(11) NOT NULL auto_increment,</span>
Copier après la connexion
<span><span>  </span>`D` int(11) NOT NULL default '0',</span>
Copier après la connexion
<span><span>  </span>`B` varchar(200) NOT NULL default '',</span>
Copier après la connexion
<span><span>  </span>`C` varchar(175) default NULL,</span>
Copier après la connexion
<span><span>  </span>PRIMARY KEY<span>  </span>(`A`,`D`,`B`),</span>
Copier après la connexion
<span><span>  </span>KEY `B` (`B`,`C`),</span>
Copier après la connexion
<span><span>  </span>KEY `C` (`C`),</span>
Copier après la connexion
<span><span>  </span>CONSTRAINT `0_38775` FOREIGN KEY (`A`, `D`)</span>
Copier après la connexion
<span>REFERENCES `ibtest<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="11" unitname="a">11a</chmetcnv>` (`A`, `D`)</span>
Copier après la connexion
<span>ON DELETE <font>CASCADE</font> ON UPDATE <font>CASCADE</font>,</span>
Copier après la connexion
<span><span>  </span>CONSTRAINT `0_38776` FOREIGN KEY (`B`, `C`)</span>
Copier après la connexion
<span>REFERENCES `ibtest<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="11" unitname="a">11a</chmetcnv>` (`B`, `C`)</span>
Copier après la connexion
<span>ON DELETE <font>CASCADE</font> ON UPDATE <font><font>CASCADE</font></font></span>
Copier après la connexion
<span>) ENGINE=INNODB CHARSET=latin1</span>
Copier après la connexion
<span>1 row in set (0.01 sec)</span>
Copier après la connexion
Copier après la connexion
<span>mysql> <strong>ALTER TABLE ibtest<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="11" unitname="C">11c</chmetcnv> DROP FOREIGN KEY 0_38775;</strong></span>
Copier après la connexion

InnoDB解析程序允许你在FOREIGN KEY ... REFERENCES ...子句中用`(backticks)把表和列名名字围起来。InnoDB解析程序也考虑到lower_case_table_names系统变量的设置。

InnoDB返回一个表的外键定义作为SHOW CREATE TABLE语句输出的一部分:

<span>SHOW CREATE TABLE <em>tbl_name</em>;</span>
Copier après la connexion

从这个版本起,mysqldump也将表的正确定义生成到转储文件中,且并不忘记外键。

你可以如下对一个表显示外键约束:

<span>SHOW TABLE STATUS FROM <em>db_name</em> LIKE '<em>tbl_name</em>';</span>
Copier après la connexion

外键约束被列在输出的Comment列。

当执行外键检查之时,InnoDB对它照看着的子或父记录设置共享的行级锁。InnoDB立即检查外键约束,检查不对事务提交延迟。

要使得对有外键关系的表重新载入转储文件变得更容易,mysqldump自动在转储输出中包括一个语句设置FOREIGN_KEY_CHECKS为0。这避免在转储被重新装载之时,与不得不被以特别顺序重新装载的表相关的问题。也可以手动设置这个变量:

<span>mysql> <strong>SET FOREIGN_KEY_CHECKS = 0;</strong></span>
Copier après la connexion
<span>mysql> <strong>SOURCE <em>dump_file_name</em>;</strong></span>
Copier après la connexion
<span>mysql> <strong>SET FOREIGN_KEY_CHECKS = 1;</strong></span>
Copier après la connexion

如果转储文件包含对外键是不正确顺序的表,这就以任何顺序导入该表。这样也加快导入操作。设置FOREIGN_KEY_CHECKS为0,对于在LOAD DATA和ALTER TABLE操作中忽略外键限制也是非常有用的。

InnoDB不允许你删除一个被FOREIGN KEY表约束引用的表,除非你做设置SET FOREIGN_KEY_CHECKS=0。当你移除一个表的时候,在它的创建语句里定义的约束也被移除。

如果你重新创建一个被移除的表,它必须有一个遵从于也引用它的外键约束的定义。它必须有正确的列名和类型,并且如前所述,它必须对被引用的键有索引。如果这些不被满足,MySQL返回错误号1005 并在错误信息字符串中指向errno 150。

 
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la sauvegarde et la restauration MySQL en PHP ? Comment utiliser la sauvegarde et la restauration MySQL en PHP ? Jun 03, 2024 pm 12:19 PM

La sauvegarde et la restauration d'une base de données MySQL en PHP peuvent être réalisées en suivant ces étapes : Sauvegarder la base de données : Utilisez la commande mysqldump pour vider la base de données dans un fichier SQL. Restaurer la base de données : utilisez la commande mysql pour restaurer la base de données à partir de fichiers SQL.

Comment optimiser les performances des requêtes MySQL en PHP ? Comment optimiser les performances des requêtes MySQL en PHP ? Jun 03, 2024 pm 08:11 PM

Les performances des requêtes MySQL peuvent être optimisées en créant des index qui réduisent le temps de recherche d'une complexité linéaire à une complexité logarithmique. Utilisez PreparedStatements pour empêcher l’injection SQL et améliorer les performances des requêtes. Limitez les résultats des requêtes et réduisez la quantité de données traitées par le serveur. Optimisez les requêtes de jointure, notamment en utilisant des types de jointure appropriés, en créant des index et en envisageant l'utilisation de sous-requêtes. Analyser les requêtes pour identifier les goulots d'étranglement ; utiliser la mise en cache pour réduire la charge de la base de données ; optimiser le code PHP afin de minimiser les frais généraux.

Comment insérer des données dans une table MySQL en utilisant PHP ? Comment insérer des données dans une table MySQL en utilisant PHP ? Jun 02, 2024 pm 02:26 PM

Comment insérer des données dans une table MySQL ? Connectez-vous à la base de données : utilisez mysqli pour établir une connexion à la base de données. Préparez la requête SQL : Écrivez une instruction INSERT pour spécifier les colonnes et les valeurs à insérer. Exécuter la requête : utilisez la méthode query() pour exécuter la requête d'insertion en cas de succès, un message de confirmation sera généré.

Comment créer une table MySQL en utilisant PHP ? Comment créer une table MySQL en utilisant PHP ? Jun 04, 2024 pm 01:57 PM

La création d'une table MySQL à l'aide de PHP nécessite les étapes suivantes : Connectez-vous à la base de données. Créez la base de données si elle n'existe pas. Sélectionnez une base de données. Créer un tableau. Exécutez la requête. Fermez la connexion.

Comment utiliser les procédures stockées MySQL en PHP ? Comment utiliser les procédures stockées MySQL en PHP ? Jun 02, 2024 pm 02:13 PM

Pour utiliser les procédures stockées MySQL en PHP : Utilisez PDO ou l'extension MySQLi pour vous connecter à une base de données MySQL. Préparez l'instruction pour appeler la procédure stockée. Exécutez la procédure stockée. Traitez le jeu de résultats (si la procédure stockée renvoie des résultats). Fermez la connexion à la base de données.

Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4 Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4 Dec 09, 2024 am 11:42 AM

L'un des changements majeurs introduits dans MySQL 8.4 (la dernière version LTS en 2024) est que le plugin « MySQL Native Password » n'est plus activé par défaut. De plus, MySQL 9.0 supprime complètement ce plugin. Ce changement affecte PHP et d'autres applications

La différence entre la base de données Oracle et MySQL La différence entre la base de données Oracle et MySQL May 10, 2024 am 01:54 AM

La base de données Oracle et MySQL sont toutes deux des bases de données basées sur le modèle relationnel, mais Oracle est supérieur en termes de compatibilité, d'évolutivité, de types de données et de sécurité ; tandis que MySQL se concentre sur la vitesse et la flexibilité et est plus adapté aux ensembles de données de petite et moyenne taille. ① Oracle propose une large gamme de types de données, ② fournit des fonctionnalités de sécurité avancées, ③ convient aux applications de niveau entreprise ; ① MySQL prend en charge les types de données NoSQL, ② a moins de mesures de sécurité et ③ convient aux applications de petite et moyenne taille.

Comment supprimer des données d'une table MySQL en utilisant PHP ? Comment supprimer des données d'une table MySQL en utilisant PHP ? Jun 05, 2024 pm 12:40 PM

PHP fournit les méthodes suivantes pour supprimer des données dans les tables MySQL : Instruction DELETE : utilisée pour supprimer les lignes correspondant aux conditions de la table. Instruction TRUNCATETABLE : utilisée pour effacer toutes les données de la table, y compris les ID auto-incrémentés. Cas pratique : Vous pouvez supprimer des utilisateurs de la base de données à l'aide de formulaires HTML et de code PHP. Le formulaire soumet l'ID utilisateur et le code PHP utilise l'instruction DELETE pour supprimer l'enregistrement correspondant à l'ID de la table des utilisateurs.

See all articles