Выдача внешних ключей - PullRequest
       20

Выдача внешних ключей

1 голос
/ 17 ноября 2010

У меня есть таблица, созданная с помощью запроса

CREATE TABLE branch_dim (  
   branch_id numeric(18,0) NOT NULL,  
   country_name varchar(30),  
   island_name char(30),    
   region_name varchar(30),  
   branch_name varchar(30),  
   region_manager varchar(30),  
   marketing_manager varchar(30),  
   branch_manager varchar(30),  
   promoter_main varchar(30),   
   promoter_other varchar(30),  
   PRIMARY KEY (branch_id,island_name)   
 ) ON branch_dim_scheme(island_name)

Теперь у меня есть другая таблица

CREATE TABLE order_fact (  
   branch_id numeric(18,0) NOT NULL,  
   product_id numeric(18,0) NOT NULL,  
   order_id numeric(18,0) NOT NULL,  
   day_id numeric(18,0) NOT NULL,  
   FOREIGN KEY (branch_id) REFERENCES branch_dim (branch_id),  
)

В первом запросе есть раздел, поэтому у меня есть 2 первичных ключа.Теперь, если я выполняю второй запрос, я получаю сообщение об ошибке

"В ссылочной таблице" branch_dim "нет первичных ключей или ключей-кандидатов, которые соответствуют списку справочных столбцов во внешнем ключе" FK_order_fac_branc_10234AD ""

В чем может быть проблема?

Ответы [ 4 ]

4 голосов
/ 17 ноября 2010

Вы определили первичный ключ для branch_dim как составной первичный ключ, состоящий из branch_id и island_name.Когда вы создаете order_fact, вы пытаетесь ссылаться только на branch_id в качестве внешнего ключа.

1 голос
/ 17 ноября 2010

Ваша таблица имеет составной первичный ключ:

CREATE TABLE branch_dim (

PRIMARY KEY (branch_id,island_name)

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

CREATE TABLE order_fact (  
   branch_id numeric(18,0) NOT NULL,  
   island_name char(30),
   product_id numeric(18,0) NOT NULL,  
   order_id numeric(18,0) NOT NULL,  
   day_id numeric(18,0) NOT NULL,  

   FOREIGN KEY (branch_id, island_name) 
     REFERENCES branch_dim (branch_id, island_name)

Совет: для чего-либо длиннее 5 символов или около того никогда использовать CHAR(x) в качестве типа данных - это создаст поле длиной всегда 30 символов - сохраняете ли вы в нем столько символов или нет.Если вы храните меньше, значение дополняется пробелами до определенной длины (30 символов).

Для любых символов, длина которых превышает 5, я бы рекомендовал всегда использовать VARCHARвместо этого!

То же самое относится и к numeric(18,0): для поля ID я бы всегда использовал INT - гораздо приятнее, чище, меньше, просто лучше!

0 голосов
/ 18 ноября 2010

Я решил проблему, сделав поле первичного ключа (branch_id) как NONCLUSTERED и UNIQUE, и сделал поле island_name как и поэтому у меня был только один первичный ключ, и мой ключ раздела - island_name. Это решило мою проблему. Спасибо всем за помощь ..

0 голосов
/ 17 ноября 2010

Вам нужно сделать первичный ключ branch_dim просто branch_id и добавить индекс для island_name.Кроме того, вы действительно числовые значения branch_ids (18, 0)?Если это так, я бы сделал суррогатный первичный ключ (то, что может быть автоматически увеличено, int или bigint, identity).

Как таковой, ваш первичный ключ (и, следовательно, кластерный индекс) очень широк.Это снизит производительность, и я предполагаю, что в вашем сценарии фрагментируйте ваш кластерный индекс (плохо).

...