Ce qui est enregistré ici est un bug qui s'est produit il y a longtemps. Il vous présente principalement les informations pertinentes sur les contraintes uniques et NULL dans MySQL. L'introduction dans l'article est très détaillée et a une certaine valeur de référence et d'apprentissage pour tout le monde. . Amis qui en ont besoin Jetons un coup d'œil ci-dessous.
Préface
Une exigence que j'ai faite auparavant, une description simplifiée consiste à accepter les messages MQ d'autres groupes, puis à insérer un enregistrement dans le base de données . Afin de les empêcher d'envoyer des messages répétés et d'insérer plusieurs enregistrements en double, des index uniques ont été ajoutés à plusieurs colonnes du tableau.
CREATE UNIQUE INDEX IDX_UN_LOAN_PLAN_APP ON testTable (A, B, C);
À l'heure actuelle, les valeurs NULL ne sont pas autorisées dans les colonnes A, B et C, et la contrainte d'unicité fonctionne également.
Plus tard, en raison de changements dans les exigences, la contrainte d'unicité précédente a été modifiée et une colonne supplémentaire a été ajoutée. (Je n'entrerai pas dans les détails sur pourquoi.)
ALTER TABLE testTable DROP INDEX IDX_UN_LOAN_PLAN_APP, ADD UNIQUE KEY `IDX_UN_LOAN_PLAN_APP` (A, B, C, D);
Le D nouvellement ajouté est de type datetime, autorisant NULL, et la valeur par défaut est NULL. La raison pour laquelle la valeur par défaut est NULL est que tous les enregistrements n'ont pas cette heure. Si vous définissez de force une valeur magique (telle que « 1970-01-01 08:00:00 ») comme valeur par défaut, cela semblera étrange.
Reine bleue. . . Quelque chose s'est mal passé. Après avoir ajouté D, la contrainte d’unicité est fondamentalement invalide.
Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK Insert into testTable (A,B,C,D) VALUES (1,2,3,NULL); --- OK
Les trois SQL ci-dessus peuvent tous être exécutés avec succès et il y aura plusieurs enregistrements identiques dans la base de données. Selon notre idée précédente, l'exception 'Clé en double' devrait être levée lors de l'exécution des deux derniers SQL.
Après l'avoir vérifié, j'ai découvert que le document officiel de MySQL l'indiquait clairement. Les index uniques permettent l'existence de plusieurs valeurs NULL :
A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index allows multiple NULL values for columns that can contain NULL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!