2017-09-02 2 views
0

Comment obtenir l'ID du dernier élément ajouté dans le? De ma recherche sur le web, j'ai trouvé que vous pouvez utiliser @@ IDENTITY et IDENTITY_SCOPE() mais seulement en les ajoutant/en étant dans le. J'ai essayé ce qui suit, mais il ne fonctionne pasComment trouver le dernier identifiant ajouté dans une table non auto incrémentée?

CREATE TABLE Products 
(PT_ID int PRIMARY KEY, Name nvarchar(20)) 

CREATE TABLE Storage(ST_ID int Primary key,Info nvarchar(20)) 

CREATE TABLE ProductStorageMM 
(ST_ID int CONSTRAINT S_FK FOREIGN KEY REFERENCES Storage(ST_ID), 
PT_ID int CONSTRAINT P_FK FOREIGN KEY REFERENCES Products(PT_ID), 
Status int not null, 
PRIMARY KEY (ST_ID ,PT_ID) 
) 

Les tableaux ci-dessus ne sont que pour les expériences sake.I essaie de, lors de l'ajout d'une valeur dans la table de produit définit automatiquement toutes les valeurs du produit donné Les stockages à zéro.

 CREATE PROCEDURE AddingProduct 
    (@PID int ,@NAME nvarchar(20)) 
    AS BEGIN 
    INSERT INTO Products(PT_ID,Name) 
    VALUES(@PID,@NAME) 

    INSERT INTO PSKT (PT_ID,ST_ID,Status) 
    SELECT PTT.PT_ID ,STT.ST_ID,0 
    FROM (SELECT * FROM Storage) AS STT, 
      (SELECT * FROM Products WHERE PT_ID=SCOPE_IDENTITY()) AS PTT; 

END 

La procédure ne fonctionne pas.Que je fais mal?

+3

'@@ IDENTITY' est pour Microsoft SQL Server. Votre question est taguée MySQL. Lequel utilisez-vous actuellement? –

+0

En MySQL vous devriez utiliser MAX() pour trouver le dernier ID ajouté –

+0

@MattGibson Ah, désolé, je n'ai pas remarqué cela. J'utilise sql server – King23

Répondre

2

Ai-je raté quelque chose? @PID n'est-il pas la dernière identité utilisée? @@ IDENTITY et SCOPE_IDENTITY sont utilisés pour les identités auto-incrémentées. Vous ne montrez pas d'auto-incrément ici, vous passez l'identité à la procédure. Cela insère une ligne dans PSKT pour le @PID passé avec chaque ligne dans STORAGE.

-> Code donné où l'identité est passée à travers un paramètre

CREATE PROCEDURE AddingProduct 
    (@PID int ,@NAME nvarchar(20)) 
    AS BEGIN 
    INSERT INTO Products(PT_ID,Name) 
    VALUES(@PID, @NAME) 

    INSERT INTO PSKT (PT_ID,ST_ID,Status) 
    SELECT @PID ,STT.ST_ID,0 
    FROM Storage STT 

END 

-> Exemple d'utilisation incrémentation automatique et @@ identité

CREATE PROCEDURE AddingProduct 
    (@NAME nvarchar(20)) 
    AS BEGIN 
    INSERT INTO Products(Name) --< identity is inserted through auto-increment 
    VALUES(@NAME) 

    set @pid = @@identity --< we need to get the identity created in the previous step for the next step. 

    INSERT INTO PSKT (PT_ID,ST_ID,Status) 
    SELECT @PID ,STT.ST_ID,0 
    FROM Storage STT 

FIN

+0

I difficile que vous pourriez utiliser l'identité sans ID auto-incrémenté – King23

+1

Non, @@ identity renvoie la dernière identité auto-incrémentée. Lorsque vous utilisez l'incrémentation automatique, vous ne savez pas quelle identité a été créée. Dans votre cas, vous connaissez l'identité, alors pourquoi voudriez-vous appeler une fonction pour l'obtenir? – LAS