Как я могу обойти это ограничение внешнего ключа, имеющего уникальное имя? - PullRequest
0 голосов
/ 12 июля 2009

Я не уверен, почему они должны быть уникальными, но из чтения форумов MySQL выясняется, что это так. Тем не менее, я думаю, что это как-то связано с именем INDEX. У меня есть две таблицы, которые имеют ограничения внешнего ключа, ссылающиеся на один и тот же первичный ключ в третьей таблице. Если это помогает, я использую 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;

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

Ответы [ 3 ]

2 голосов
/ 12 июля 2009

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

1 голос
/ 07 октября 2010

Вы создаете индекс (ограничение) по имени product_id через: ИНДЕКС product_id

Затем вы создаете другое ограничение (для внешнего ключа) с тем же именем: ОГРАНИЧЕНИЕ product_id

Вам нужно разрешить серверу предоставить уникальное имя ограничения по умолчанию, удалив ОГРАНИЧЕНИЕ product_id

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

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

0 голосов
/ 12 июля 2009

В 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...