Як створити таблицю з стовпцем особи


111

У мене є існуюча таблиця, яку я збираюся підірвати, оскільки я не створив її за допомогою IDстовпця, встановленого як стовпець Ідентичність таблиці.

Використовуючи студію управління SQL Server , я написав сценарій "Створити для ..." існуючої таблиці і отримав це:

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]

Моє запитання полягає в тому, як би я змінив це SQLтак, щоб у моїй отриманій таблиці IDстовпець був встановлений як Ідентичність ?


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

Відповіді:


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
Я вважаю, що саме це я шукав. Мені не потрібно змінювати PK_Historyзначення на IDчи що-небудь?
jp2code

Ні, це повинно бути все, що вам потрібно, PK_History - це лише назва обмеження, обмеження первинного ключа вже є ідентифікатором стовпця
Gratzy

1
яке значення параметрів ІДЕНТИЧНОСТІ (1,1)
otc

4
Ідентифікація (насіння, приріст) docs.microsoft.com/en-us/sql/t-sql/statements/…
Gratzy

33

На це вже відповіли, але я думаю, що найпростіший синтаксис:

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

Складніший індекс обмежень корисний, коли ви хочете змінити параметри.

До речі, я вважаю за краще називати такий стовпець HistoryId, тому він відповідає назвам стовпців у зовнішніх ключових зв’язках.


5
ОП спеціально працює з виходом інструмента GUI, який виводить DDL для існуючого об'єкта. Цей інструмент, ймовірно, не має опції "використовувати простіший синтаксис, якщо можливо". Найменшою схильністю до помилок у конкретній ситуації ОП було б редагувати один рядок у створеному DDL, а не намагатися записати його з нуля, використовуючи найпростіший синтаксис. Також приклад, який ви навели, не присвоює ім'я обмеженню ПК, як це має ОП. Багато хто вважає за краще названі мої обмеження, щоб вони мали однакове ім'я у всіх середовищах (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Я вірю.
Шеннон Северанс

3
Можливо, може й ні. Я був у ситуаціях, коли я брав скрипт з однієї бази даних, використовував його на іншому сервері, і типові параметри, які працювали в одному місці, не були найкращими для іншого. У будь-якому випадку, я запропонував це лише як рішення, оскільки мені це здається більш простим (я особисто розумію ключове слово "первинний ключ" набагато краще, ніж я розумію варіанти обмеження, і я вважаю використання параметрів, які я не розумію як "погані" "). Однак ви добре зазначаєте, чому може бути віддано перевагу інше рішення. Варто додати, що ця відповідь - це вже прийнята відповідь.
Гордон Лінофф

@GordonLinoff: Мате, первинний ключ за замовчуванням не є нульовим, чому вам потрібно чітко вказати тут не null?
Учень

@Learner. . . Обидва обмеження були в коді ОП. NOT NULLЄ зайвим.
Гордон Лінофф

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

звичайно, оскільки ви створюєте таблицю в студії управління SQL Server, ви можете використовувати дизайнер таблиці для встановлення специфікацій ідентичності.

введіть тут опис зображення


1
Ну, дякую Філу. Я знаю, як це зробити, але не можу, оскільки стіл вже є. Я повинен видалити таблицю і відтворити її, отже, чому я використовую сценарій.
jp2code

4
@ jp2code: Я мав на увазі, що ви могли створити тестову таблицю зі стовпцем Identity, а потім написали сценарій, щоб побачити, як це слід вказати.
Філ

-2

Унікальний ключ дозволяє максимум 2 значення NULL. Пояснення:

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

Якщо ви спробуєте вставити ті самі значення, що і нижче:

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

Кожен раз, коли ви будете отримувати помилки, наприклад:

Порушення UNIQUE KEY обмеження 'UQ__teppp__72E12F1B2E1BDC42'. Неможливо вставити повторюваний ключ в об’єкт 'dbo.teppp'.
Заява скасована.


Мені потрібно було зробити IDколонку унікальною , а не Nameколонку. Чому ви додали унікальний обмеження до Nameстовпця? Як це приносить вам користь у вашій tepppтаблиці?
jp2code

1
Зовсім не відповідь на питання Q
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.