2016-04-05 2 views
1

У меня есть таблица с первичным ключом в первом столбце, но когда я вижу данные, доступные в этой таблице, я обнаружил, что записи повторяются, включая данные первичного ключа. Я хочу знать, как это возможно? Имеет ли первичный столбец повторяющиеся данные в SQL Server 2008?Как вставить дублирующее значение в столбце первичного ключа?

enter image description here

 SET ANSI_NULLS ON 
     GO 

     SET QUOTED_IDENTIFIER ON 
     GO 

     SET ANSI_PADDING ON 
     GO 

     CREATE TABLE [dbo].[DemoTbl](
      [ProcedureId] [int] NOT NULL, 
      [ProcedureName] [nvarchar](100) NOT NULL, 
      [VersionNo] [char](5) NULL, 
      [PublishDate] [datetime] NULL, 
      [PublishUser] [varchar](50) NULL, 

      [SpecialtyId] [int] NOT NULL, 
      [ProcedureNumber] [varchar](20) NULL, 
      [PowerpointName] [nvarchar](100) NULL, 
      [Duration] [int] NOT NULL, 

      [LanguageId] [int] NOT NULL, 

      [TierId] [smallint] NOT NULL, 
      [PrintPdf] [bit] NULL, 
      [PresentationModeId] [tinyint] NULL, 
     CONSTRAINT [pk_DemoTbl] PRIMARY KEY CLUSTERED 
     (
      [ProcedureId] ASC, 
      [LanguageId] ASC 
     )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
     ) ON [PRIMARY] 

     GO 

     SET ANSI_PADDING OFF 
     GO 

     ALTER TABLE [dbo].[DemoTbl] WITH CHECK ADD FOREIGN KEY([PresentationModeId]) 
     REFERENCES [dbo].[DemoTbl] ([PresentationModeId]) 
     GO 

     ALTER TABLE [dbo].[DemoTbl] WITH CHECK ADD CONSTRAINT [FK_DemoTbl_Specialty] FOREIGN KEY([SpecialtyId]) 
     REFERENCES [dbo].[Specialty] ([SpecialtyId]) 
     GO 

     ALTER TABLE [dbo].[DemoTbl] CHECK CONSTRAINT [FK_DemoTbl_Specialty] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] WITH CHECK ADD CONSTRAINT [FK_DemoTbl_TierMaster] FOREIGN KEY([TierId]) 
     REFERENCES [dbo].[TierMaster] ([TierId]) 
     GO 

     ALTER TABLE [dbo].[DemoTbl] CHECK CONSTRAINT [FK_DemoTbl_TierMaster] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] ADD CONSTRAINT [DF_DemoTbl_CreationDate] DEFAULT (getdate()) FOR [CreationDate] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] ADD CONSTRAINT [DF_DemoTbl_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] ADD CONSTRAINT [DF_DemoTbl_IsActive] DEFAULT ((1)) FOR [IsActive] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] ADD CONSTRAINT [DF_DemoTbl_LanguageId] DEFAULT ((1)) FOR [LanguageId] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] ADD CONSTRAINT [DF_DemoTbl_ManageContent] DEFAULT ('false') FOR [ManageContent] 
     GO 

     ALTER TABLE [dbo].[DemoTbl] ADD CONSTRAINT [DF__Procedure__Print__1B14C01D] DEFAULT ((1)) FOR [PrintPdf] 
     GO 
+1

Может ли это быть составной первичный ключ? Ваше изображение просто не выглядит возможным для одной и той же таблицы в той же базе данных. –

+0

Первичный ключ по определению уникален. Вы уверены, что результаты на изображении - результат одного выбора на одной таблице? –

+2

Покажите нам инструкцию create table. (И также измените таблицу, если она есть.) – jarlh

ответ

6

Нет, это не возможно в SQL Server для вставки записи, которые имеют повторяющиеся значения первичного ключа.

+2

Я бы также добавил, что это невозможно в любом из механизмов реляционной базы данных по причине отказа. – fabricio

+0

Согласовано - и для меня теория, согласно которой столбец ProedureId является _not_ acutally первичным ключом (возможно, ключ, но не первичный ключ), кажется наиболее скупым. Пример CREATE TABLE показал бы это. –

2

Невозможно иметь более одной строки в одной таблице с тем же самым первичным ключом (PK).

Если вы делаете ОТБОРНОЕ и получение более одной строки с тем же ПК может быть:

  1. Эта таблица на самом деле не имеет ПК, может быть, он не был должным образом создан. Вы можете проверить это, выполнив следующие действия (он должен вернуть столбец PK):

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'TableName' AND COLUMN_KEY = 'PRI';

  2. Неверная инструкция SELECT. Возможно, вы выбираете из двух или более таблиц, и вы не относитесь к ним правильно.

Чтобы уточнить, вы можете сделать следующее:
1- Создать новую таблицу:

CREATE TABLE IF NOT EXISTS `Customer` (
    `id` int(4), 
    `name` varchar(20), 
    `surname` varchar(40), 
    `phone` int(9), 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB; 

Теперь у вас есть новая таблица для хранения клиентов, идентифицированных идентификатором.
2- Давайте добавим несколько клиентов:

INSERT INTO Customer VALUES(111, 'John', 'White', 123456789), 
    (222, 'Bianca', 'Williams', 987654321), 
    (333, 'Mikel', 'Peterson', 421345642), 
    (444, 'Jolene', 'Gomez', 948113552); 

3- Если вы пытаетесь вставить клиент с существующими ПК (ID) вы получите ошибку:

INSERT INTO Customer VALUES (222, 'Paul', 'Brown', 123412345); 

4- Для того, чтобы проверить окончательную таблицу, вы можете сделать следующее выбрать:

SELECT * FROM Customer; 
0

нет, это не возможно, чтобы иметь повторяющиеся первичные ключи, если primary key constraint был установлен True.

Далее, чтобы предотвратить повторяющиеся первичные ключи установить Identity Specification в True

0

Если эта таблица является промежуточной таблицы в многие ко многим связи исходных столбцов внешних ключей и в состоянии принять много примеров одного и того же PRODID (целая точка упражнения). Если кто-то тогда захлопывает PK в этом столбце, то больше дубликатов не может быть добавлено, но если вы его запросите, таблица все равно вернет исходный материал в скриншоте этих парней.

Этот сценарий можно увидеть в базе данных образцов Northwind между Продуктами и заказами (таблица OrderDetails имеет составной PK на OrderID, ProdID, но по-прежнему показывает дубликаты обоих). ПК добавили после того, как были добавлены данные.

Промежуточная таблица является связующим звеном между таблицами Many-to-Many и вообще не нуждается в PK. Нормализация 101.

0

Для PK Constraint это создает уникальный индекс (кластерный/некластеризованный) на определенной PK. Если мы отключим индексы перед загрузкой, которые включают индекс PK Unique, а также мы можем вставить дубликат PK в столбец, потому что ограничение PK отключено. Поэтому, при отключении индексов, пожалуйста, избегайте индекса PK не отключать «is_primary_key = 0 для отключения всех других индексов»

Смежные вопросы