2009-07-11 3 views
0

Я не уверен, почему они должны быть уникальными, но, читая форумы MySQL, кажется, что они это делают. Однако, я думаю, что это имеет больше общего с именем INDEX. У меня есть две таблицы с ограничениями внешнего ключа, ссылающиеся на один и тот же первичный ключ на третьей таблице. Если это помогает, я использую workbench MySQL для разработки схемы.Как я могу обойти это ограничение внешнего ключа, чтобы иметь уникальное имя?

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

CREATE TABLE IF NOT EXISTS `joe`.`products_to_categories` (
    `product_to_category_id` INT NOT NULL AUTO_INCREMENT , 
    `category_id` INT NOT NULL , 
    `product_id` INT NOT NULL , 
    PRIMARY KEY (`product_to_category_id`) , 
    INDEX `category_id` (`category_id` ASC) , 
    INDEX `product_id` (`product_id` ASC) , 
    CONSTRAINT `category_id` 
    FOREIGN KEY (`category_id`) 
    REFERENCES `joe`.`categories` (`category_id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `product_id` 
    FOREIGN KEY (`product_id`) 
    REFERENCES `joe`.`products` (`product_id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

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

ответ

2

Это невозможно, потому что у вас возникнет конфликт в имени файла для файла, который используется для индекса IIRC. Вероятно, я бы назвал ключ < tablename> _ < column_name> или что-то в этом роде.

+0

Я не помню точно !! Я столкнулся с этой проблемой, для этого требуется уникальное имя ограничения, даже если ограничение относится к разной схеме/db на одном компьютере/установке –

+0

Конечно, вы можете создавать уникальные имена, однако это больше подвержено ошибкам, чем просто позволяет MySQL находить уникальное имя. См. этот URL: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign -key-constraints.html «Если указано предложение символа CONSTRAINT, значение символа должно быть уникальным в базе данных. Если предложение не указано, InnoDB автоматически создает имя. " –

0

В PostgreSQL по умолчанию для индексирования индексов следует добавить «_pkey» и «_fkey» к имени основного и внешнего ключей, соответственно. Таким образом, ваше дело будет выглядеть так:

INDEX `product_id_fkey` (`product_id` ASC) , 

ОБНОВЛЕНИЕ: Я просто попробовал это, и это сработало. Посмотрите, что вы имели в виду.

use test; 

create table if not exists test.product 
(
    product_id int not null auto_increment, 
    name varchar(80) not null, 
    primary key(product_id) 
); 

create table if not exists test.category 
(
    category_id int not null auto_increment, 
    name varchar(80) not null, 
    primary key(category_id) 
); 

create table if not exists test.product_category 
(
    product_id int, 
    category_id int, 
    primary key(product_id, category_id), 
    constraint product_id_fkey 
     foreign key(product_id) references product(product_id) 
     on delete cascade 
     on update no action, 
    constraint category_id_fkey 
     foreign key(category_id) references category(category_id) 
     on delete cascade 
     on update no action 
); 

insert into test.product(name) values('teddy bear'); 
insert into test.category(name) values('toy'); 
insert into test.product_category 
    select p.product_id, c.category_id from product as p, category as c 
    where p.name = 'teddy bear' and c.name = 'toy'; 
+0

Так действительно ли индекс для product_id вызывает конфликт, а фактическое имя внешнего ключа в порядке? – 2009-07-11 21:40:25

+0

Попробуйте это и увидите, что это мой совет. – duffymo

+0

AFAIK это не имеет значения в mysql –

1

Вы создаете индекс (ограничение) по имени product_id через: INDEX product_id

Тогда вы идете и создать другое ограничение (для внешнего ключа) с тем же именем: CONSTRAINT product_id

Что вам нужно сделать, это позволить серверу предоставлять по умолчанию, уникальное имя ограничения, удалив CONSTRAINT product_id

См. Этот URL-адрес: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

«Если указано предложение символа CONSTRAINT, значение символа должно быть уникальным в базе данных. Если предложение не указано, InnoDB автоматически создает имя. «