2010-03-28 6 views
1

J'ai une table avec la clé primaire (ColumnA, ColumnB). Je veux faire une fonction ou une procédure qui une fois passée deux entiers insèrent une rangée dans la table mais s'assurent que le plus grand entier va toujours dans ColumnA et le plus petit dans ColumnB.Définir la clé primaire avec deux entiers

Donc, si nous avons SetKeysWithTheseNumbers (17, 19) retournerait

|-----------------| 
|ColumnA | ColumnB| 
|-----------------| 
|19  | 17  | 
|-----------------| 

SetKeysWithTheseNumbers (19, 17) retournerait la même chose

|-----------------| 
|ColumnA | ColumnB| 
|-----------------| 
|19  | 17  | 
|-----------------| 

Répondre

3

Utilisation:

INSERT INTO your_table 
    (COLUMN_A, COLUMN_B) 
VALUES(GREATEST(@param_a, @param_b), 
     LEAST(@param_a, @param_b)) 

Référence:

+0

Voilà ce que je cherchais mot pour mot. Je ne pouvais pas comprendre l'équivalent de max et min. –

0

Voici une procédure de magasin

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `SetKeysWithTheseNumbers` $$ 
CREATE PROCEDURE `SetKeysWithTheseNumbers` (

n1 integer, 
n2 integer 


) 
BEGIN 

declare n3 integer; 
declare n4 integer; 

if(n1 > n2) then 
set n3=n1; 
set n4=n2; 
else 
set n3=n2; 
set n4=n1; 
end if; 

insert into mytable values(n3,n4); 



END $$ 

DELIMITER ; 
+0

Cela semble faire l'affaire, merci. Je pensais que j'utiliserais juste deux instructions d'insertion à la place de l'assignation de n3, n4. –

0

Vous pouvez essayer triggers:

delimiter // 

CREATE TRIGGER greater_ColA_table 
    BEFORE INSERT ON table 
    FOR EACH ROW 
    BEGIN 
    DECLARE a INTEGER; 
    IF NEW.ColumnA < NEW.ColumnB THEN 
     SET a=NEW.ColumnA; 
     SET NEW.ColumnA=NEW.ColumnB, NEW.ColumnB=a; 
    END IF; 
    END // 

delimiter ; 

Répétez l'opération pour l'événement BEFORE UPDATE.

Questions connexes