sql >> Databáze >  >> RDS >> Sqlserver

Jak používat vlastnost IDENTITY() v SQL Server

Když používáte T-SQL k vytvoření (nebo změně) tabulky na SQL Server, máte možnost použít IDENTITY() vlastnost k vytvoření sloupce identity.

Sloupec identity obsahuje automaticky se zvyšující identifikační číslo. IDENTITY() vlastnost lze použít s CREATE TABLE a ALTER TABLE prohlášení.

Syntaxe

Syntaxe vypadá takto:

IDENTITY [ (seed , increment) ]

semeno je hodnota, která se používá pro úplně první řádek načtený do tabulky.

přírůstek je přírůstková hodnota, která se přičte k hodnotě identity předchozího načteného řádku.

Musíte zadat oba argumenty nebo žádný. Pokud nezadáte ani jedno, výchozí hodnota je (1,1) .

Příklad 1 – Základní použití

Zde je příklad k demonstraci.

CREATE TABLE Pets (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255)
    );

Tento kód vytvoří tabulku se dvěma sloupci. První sloupec (PetId ) je sloupec identity, protože používám IDENTITY() vlastnost v její definici.

Nyní, když jsem vytvořil sloupec identity, mohu do PetName vkládat jména domácích mazlíčků sloupec bez nutnosti uvádět ID pro každý řádek.

INSERT INTO Pets (PetName)
VALUES ('Homer'), ('Felix'), ('Ruff');

SELECT * FROM Pet;

Výsledek:

+---------+-----------+
| PetId   | PetName   |
|---------+-----------|
| 1       | Homer     |
| 2       | Felix     |
| 3       | Ruff      |
+---------+-----------+

Příklad 2 – Různé počáteční a přírůstky

Zde je příklad, který používá jiné semeno a přírůstek.

V tomto případě semena začíná na 150 a zvyšuje se o 10 pro každý řádek.

CREATE TABLE Cities (
    CityId int IDENTITY(150, 10) PRIMARY KEY, 
    CityName varchar(255)
    );

Nyní vložte nějaká data a vyberte je:

INSERT INTO Cities (CityName)
VALUES ('Auckland'), ('Danang'), ('Khon Kaen');

SELECT * FROM Cities;

Výsledek:

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
+----------+------------+

Příklad 3 – Nesprávné použití

Jak již bylo zmíněno, musíte zadat oba argumenty nebo žádný. Jinými slovy, nemůžete poskytnout pouze jeden argument. Zde je příklad toho, co se stane, když poskytnete pouze jeden argument.

CREATE TABLE Cities (
    CityId int IDENTITY(1) PRIMARY KEY, 
    CityName varchar(255)
    );

Výsledek:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'.

Příklad 4 – Pokus o přepsání hodnot identity

Pokud se pokusíte přepsat hodnoty automatické identity, může se zobrazit tato chyba.

INSERT INTO Cities (CityId, CityName)
VALUES (123, 'Bangkok');

Výsledek:

Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.

Je to proto, že se pokoušíte přepsat hodnoty vytvořené pomocí IDENTITY() vlastnictví. V mnoha případech se může stát, že jste prostě nevěděli, že jde o sloupec identity. V takových případech vše, co musíte udělat, je odstranit sloupec identity z vašeho INSERT prohlášení.

Pokud však skutečně děláte potřeba přepsat IDENTITY() vlastnost, viz Jak vložit hodnoty do sloupce IDENTITY na serveru SQL.

Jak již bylo zmíněno, pokud nepotřebujete přepsat hodnoty identity, můžete tento sloupec jednoduše odstranit z INSERT prohlášení.

Takže mohu upravit předchozí prohlášení na toto:

INSERT INTO Cities (CityName)
VALUES ('Bangkok');

SELECT * FROM Cities;

Výsledek:

+----------+------------+
| CityId   | CityName   |
|----------+------------|
| 150      | Auckland   |
| 160      | Danang     |
| 170      | Khon Kaen  |
| 180      | Bangkok    |
+----------+------------+

Omezení vlastnosti IDENTITY()

Vlastnost identity na sloupci zaručuje následující:

  • Každá nová hodnota je generována na základě aktuálního zdroje a přírůstku.
  • Každá nová hodnota pro konkrétní transakci se liší od ostatních souběžných transakcí v tabulce.

Nezaručuje následující:

  • Jedinečnost hodnoty
  • Po sobě jdoucí hodnoty v rámci transakce
  • Po sobě jdoucí hodnoty po restartu serveru nebo jiných selháních
  • Opětovné použití hodnot (například když INSERT operace se nezdaří)

Další informace o těchto omezeních naleznete v dokumentaci společnosti Microsoft.


  1. Chyba SQL:ORA-02291:omezení integrity

  2. Získání NoSuchMethodError:javax.persistence.Table.indexes() při provádění dotazu JPA

  3. Jaký je nejúčinnější způsob, jak zkontrolovat, zda záznam v Oracle existuje?

  4. Instalace SQL Server Failover Cluster -2