Comment créer une table avec une colonne d'identité


111

J'ai une table existante que je suis sur le point de souffler parce que je ne l'ai pas créée avec la IDcolonne définie pour être la colonne Identité de la table.

À l'aide de SQL Server Management Studio , j'ai écrit un script "Créer vers ..." de la table existante et j'ai obtenu ceci:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Ma question est la suivante: comment modifierais-je cela SQLpour que ma table résultante ait la IDcolonne définie comme identité ?


11
[ID] [int] NOT NULL IDENTITY (1,1)
Li0liQ

Réponses:


153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
) ON [PRIMARY]

1
Je crois que c'est ce que je recherchais. Je n'ai pas besoin de changer la PK_Historyvaleur en IDou quoi que ce soit?
jp2code

Non, cela devrait être tout ce dont vous avez besoin, PK_History est juste le nom de la contrainte la contrainte de clé primaire est déjà sur l'ID de colonne
Gratzy

1
quelle est la signification des paramètres IDENTITY (1,1)
otc

4
Identité (amorce, incrément) docs.microsoft.com/en-us/sql/t-sql/statements
...

33

Cela a déjà été répondu, mais je pense que la syntaxe la plus simple est:

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

L'index de contrainte plus complexe est utile lorsque vous souhaitez réellement modifier les options.

En passant, je préfère nommer une telle colonne HistoryId, afin qu'elle corresponde aux noms des colonnes dans les relations de clé étrangère.


5
OP travaille spécifiquement avec la sortie d'un outil GUI qui génère le DDL pour un objet existant. Cet outil n'a probablement pas, une option "utiliser une syntaxe plus simple si possible". Le moins sujet aux erreurs, pour la situation spécifique d'OP, serait d'éditer la ligne du DDL généré et de ne pas essayer de l'écrire à partir de zéro en utilisant la syntaxe la plus simple. De plus, l'exemple que vous avez donné n'attribue pas de nom à la contrainte PK comme OP l'a fait. Beaucoup préfèrent que mes contraintes soient nommées pour qu'elles aient le même nom dans tous les environnements (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Je crois.
Shannon Severance

3
Peut-être peut-être pas. J'ai été dans des situations où j'ai pris le script d'une base de données, je l'ai utilisé sur un autre serveur, et les valeurs par défaut qui fonctionnaient à un endroit n'étaient pas meilleures pour l'autre. Dans tous les cas, je n'ai suggéré cela que comme solution car cela me semble plus simple (personnellement, je comprends beaucoup mieux le mot-clé "clé primaire" que je comprends les options sur une contrainte et j'envisage d'utiliser des options que je ne comprends pas comme "mauvais "). Cependant, vous expliquez pourquoi une autre solution pourrait être préférée. Je dois ajouter que cette réponse est déjà la réponse acceptée.
Gordon Linoff

@GordonLinoff: Mate, la clé primaire n'est pas nulle par défaut, pourquoi vous devez spécifier explicitement non null ici?
Apprenant

@Learner. . . Les deux contraintes étaient dans le code de l'OP. Le NOT NULLest redondant.
Gordon Linoff

12
[id] [int] IDENTITY(1,1) NOT NULL,

bien sûr, puisque vous créez la table dans SQL Server Management Studio, vous pouvez utiliser le concepteur de table pour définir la spécification d'identité.

entrez la description de l'image ici


1
Eh bien, merci Phil. Je sais comment faire ça, mais je ne peux pas parce que la table est déjà là. Je dois supprimer la table et la recréer, d'où la raison pour laquelle j'utilise le script.
jp2code

4
@ jp2code: Je voulais dire que vous auriez pu créer une table de test avec une colonne Identity, puis l'écrire pour voir comment elle devrait être spécifiée.
Phil

-2

La clé unique autorise au maximum 2 valeurs NULL. Explication:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

Si vous essayez d'insérer les mêmes valeurs que ci-dessous:

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

Chaque fois que vous obtiendrez une erreur comme:

Violation de la contrainte UNIQUE KEY 'UQ__teppp__72E12F1B2E1BDC42'. Impossible d'insérer la clé en double dans l'objet 'dbo.teppp'.
La déclaration a été terminée.


J'avais besoin de rendre la IDcolonne unique , pas la Namecolonne. Pourquoi avez-vous ajouté la contrainte unique à la Namecolonne? Comment cela vous profite-t-il dans votre teppptable?
jp2code

1
Pas du tout une réponse au Q ici
Martin Smith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.