TransWikia.com

Не получается расставить связи по ключам MSSQL

Stack Overflow на русском Asked by Vladimir Maksymchuk on February 15, 2021

Здраствуйте, возникла такая проблема, я хочу поставить связь от fact к dimension2 по ключу KOATUU и от dimension3 к dimension2 по ключу nameLocality, но возникают ошибки такого характера:
[SQL Server]Конфликт инструкции ALTER TABLE с ограничением FOREIGN KEY "FK__fact__KOATUU__505BE5AD". Конфликт произошел в базе данных "OLAP", таблица "dbo.dimension2", column 'KOATUU'.
введите сюда описание изображения
введите сюда описание изображения
Хочу, чтобы вот так было. Подскажите, пожалуйста, что делаю не так и как стоит сделать. Буду очень благодарен.
Ниже представлено, как создавал ключи и связи, а также таблицы

ALTER TABLE fact ALTER COLUMN id int not null
ALTER TABLE fact ALTER COLUMN KOATUU bigint not null
ALTER TABLE fact ALTER COLUMN OPER_CODE int not null
ALTER TABLE fact ALTER COLUMN DEP_CODE int not null
ALTER TABLE departament ALTER COLUMN DEP_CODE int not null
ALTER TABLE operation ALTER COLUMN OPER_CODE int not null")
ALTER TABLE fact ADD PRIMARY KEY (id,KOATUU,OPER_CODE,DEP_CODE)
ALTER TABLE departament ADD PRIMARY KEY (DEP_CODE)
ALTER TABLE operation ADD PRIMARY KEY (OPER_CODE)
ALTER TABLE fact ADD FOREIGN KEY (DEP_CODE) REFERENCES departament(DEP_CODE)
ALTER TABLE fact ADD FOREIGN KEY (OPER_CODE) REFERENCES operation(OPER_CODE)
ALTER TABLE dimension2 ALTER COLUMN KOATUU bigint not null
ALTER TABLE dimension2 ALTER COLUMN nameLocality varchar(255) not null
ALTER TABLE dimension3 ALTER COLUMN nameLocality varchar(255) not null
ALTER TABLE dimension2 ADD PRIMARY KEY (KOATUU,nameLocality)
ALTER TABLE dimension3 ALTER COLUMN id int not null
ALTER TABLE dimension3 ADD PRIMARY KEY (id,nameLocality)
ALTER TABLE fact ADD FOREIGN KEY (KOATUU) REFERENCES dimension2(KOATUU)
ALTER TABLE dimension3 ADD FOREIGN KEY (nameLocality) REFERENCES dimension2(nameLocality)

Fact:

CREATE TABLE [dbo].[fact](
    [id] [int] NOT NULL,
    [KOATUU] [bigint] NOT NULL,
    [OPER_CODE] [int] NOT NULL,
    [D_REG] [varchar](max) NULL,
    [DEP_CODE] [int] NOT NULL,
    [BRAND] [varchar](max) NULL,
    [MODEL] [varchar](max) NULL,
    [MAKE_YEAR] [bigint] NULL,
    [COLOR] [varchar](max) NULL,
    [KIND] [varchar](max) NULL,
    [BODY] [varchar](max) NULL,
    [PURPOSE] [varchar](max) NULL,
    [FUEL] [varchar](max) NULL,
    [CAPACITY] [float] NULL,
    [OWN_WEIGHT] [varchar](max) NULL,
    [TOTAL_WEIGHT] [varchar](max) NULL,
    [N_REG_NEW] [varchar](max) NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC,
    [KOATUU] ASC,
    [OPER_CODE] ASC,
    [DEP_CODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[fact]  WITH CHECK ADD FOREIGN KEY([DEP_CODE])
REFERENCES [dbo].[departament] ([DEP_CODE])
GO

ALTER TABLE [dbo].[fact]  WITH CHECK ADD FOREIGN KEY([OPER_CODE])
REFERENCES [dbo].[operation] ([OPER_CODE])

Departament:

CREATE TABLE [dbo].[departament](
    [DEP_CODE] [int] NOT NULL,
    [DEP] [varchar](max) NULL,
PRIMARY KEY CLUSTERED 
(
    [DEP_CODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Operation:

CREATE TABLE [dbo].[operation](
    [OPER_CODE] [int] NOT NULL,
    [OPER_NAME] [varchar](max) NULL,
PRIMARY KEY CLUSTERED 
(
    [OPER_CODE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Dimension2:

CREATE TABLE [dbo].[dimension2](
    [administrativeTeritorialUnit] [varchar](max) NULL,
    [nameAdministrativeTeritorialUnit] [varchar](max) NULL,
    [KOATUU] [bigint] NOT NULL,
    [nameMedicalInstitution] [varchar](max) NULL,
    [nameObject] [varchar](max) NULL,
    [typeInstitution] [varchar](max) NULL,
    [locality] [varchar](max) NULL,
    [nameLocality] [varchar](255) NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [KOATUU] ASC,
    [nameLocality] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Dimension3:

CREATE TABLE [dbo].[dimension3](
    [id] [int] NOT NULL,
    [OBL_NAME] [varchar](max) NULL,
    [STREET_NAME] [varchar](max) NULL,
    [type] [varchar](max) NULL,
    [nameLocality] [varchar](255) NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC,
    [nameLocality] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

One Answer

Вот fiddle с приведённым кодом.

Порядок определения таблиц изменён, чтобы правильно формировались FOREIGN KEY.

Создание первичных ключей в блоке изменений закомментировано, ибо они уже созданы при создании таблицы.

Проблемные запросы выделены в отдельные блоки.


Итак, первый проблемный запрос - это

ALTER TABLE dimension3 ADD FOREIGN KEY (nameLocality) REFERENCES dimension2(nameLocality)

и сообщение об ошибке

Msg 1776 Level 16 State 0 Line 1
There are no primary or candidate keys in the referenced table 'dimension2' that match the referencing column list in the foreign key 'FK__dimension__nameL__30F848ED'.

Msg 1750 Level 16 State 1 Line 1
Could not create constraint or index. See previous errors.

Переводим (спасибо яндексу):

В ссылочной таблице "dimension2" нет первичных или потенциальных ключей, соответствующих списку ссылочных столбцов во внешнем ключе "FK__dimension__nameL__30F848ED".

Смотрим, какие индексы имеются в dimension2. Он один-единственный:

PRIMARY KEY CLUSTERED 
(
    [KOATUU] ASC,
    [nameLocality] ASC
)

Вспоминаем, что нужно для внешнего ключа:

Для создания внешнего ключа в ссылочной таблице необходимо наличие индекса, в котором выражение внешнего ключа является выражением уникального индекса.

Т.е. необходим уникальный индекс по nameLocality. А такого - нет. Его надо создать.

Аналогично исправляем и вторую проблему.

fixed fiddle

Correct answer by Akina on February 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP