Définition de la clé composite avec incrémentation automatique dans MySQL
Scénario:
J'ai une table qui fait référence à deux clés étrangères, et pour chaque combinaison unique de ces clés étrangères, a son propre type de colonne auto_increment. J'ai besoin de mettre en œuvre une Clé Composite qui aidera à identifier la ligne unique à l'aide de la combinaison de ces trois (l'une des clés étrangères et une colonne de type auto_increment, et une autre colonne avec les valeurs uniques)
Table:
CREATE TABLE `issue_log` (
`sr_no` INT NOT NULL AUTO_INCREMENT ,
`app_id` INT NOT NULL ,
`test_id` INT NOT NULL ,
`issue_name` VARCHAR(255) NOT NULL ,
primary key (app_id, test_id,sr_no)
);
Bien sûr, il y a quelque chose de mal avec ma requête, en raison de laquelle l'erreur renvoyée est:
ERREUR 1075: pas de définition de la table; il peut être un seul auto
colonne et il doit être défini comme une clé
Ce que je suis en train de réaliser:
J'ai une Demande de la Table (avec app_id que sa clé primaire), chaque Application dispose d'un ensemble de Problèmes à résoudre, et chaque Application dispose de plusieurs nombre de tests (de sorte que le test_id col)
Le sr_no col doit augmenter pour unique app_id et test_id.
c'est à dire Les données dans le tableau devrait ressembler à:
Le moteur de base de données MyISAM.
Je veux réaliser ce avec autant de simplicité que possible (c'est à dire éviter les éléments déclencheurs et les procédures si possible - ce qui a été suggéré pour les cas similaires sur d'autres Questions).
source d'informationauteur Nirav Zaveri
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir de MySQL le faire automatiquement pour vous pour les tables MyISAM - vous besoin d'utiliser un déclencheur ou une procédure, ou d'un autre moteur de base de données tels que MyISAM. Auto incrémentation peut seulement être fait pour une seule clé primaire.
Quelque chose comme ce qui suit devrait fonctionner
Vous pouvez faire cela avec myISAM et BDB moteurs. MyISAM ne prend pas en charge cette. Citation de MySQL 5.0 Reference Manual.
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Vous pouvez utiliser un unique clé composite pour
sr_no
,app_id
&test_id
. Vous ne pouvez pas utiliser progressivesr_no
que ce n'est pas unique.J'ai commenté violation de contrainte d'unicité dans sql violon à démontrer (enlever le # à la ligne 22 de schéma et de reconstruire le schéma )
Je ne comprends pas tout votre incrément exigence sur le
test_id
colonne, mais si vous voulez un ~autoincrement séquence qui redémarre à chaque combinaison unique de (app_id
test_id
), vous pouvez faire un INSERT ... SELECT à PARTIR de la même table, comme suit:Ce qui suppose la définition d'un tableau avec pas de déclaration de type de colonne AUTO_INCREMENT. Vous êtes essentiellement l'émulation autoincrement comportement avec les IFNULL(MAX()) + 1 de la clause, mais le manuel de l'émulation fonctionne arbitraire et les colonnes, à la différence de la built-in d'auto-incrémentation.
Noter que l'INSERT ... SELECT d'une seule requête garantit l'atomicité de l'opération. MyISAM va écart-verrouillage de l'indice approprié, et de nombreux processus simultanés peuvent exécuter ce genre de requête tout en produisant non contradictoires séquences.