Crie duas referências de chave estrangeira para a mesma tabela com índice composto único para uma delas

James Stott

Todos os itens da itemstabela possuem uma categoria que pode ser derivada da item_categorytabela.

+---------------------------------------------+
| items                                       |
+---------------------------------------------+
| id                 | PK                     |
+--------------------+------------------------+
| item_category_id   | FK(item_categories.id) |
+--------------------+------------------------+

A item_categorytabela faz referência a si mesma. Eu queria criar um sistema de categoria-> subcategoria-> sub-subcategoria etc. Não sei quantas subcategorias aninhadas haverá, então pensei que minha melhor aposta seria colocar essa estrutura em uma única tabela. Se item_category_idfor, NOT NULLentão ele tem um pai; caso contrário, é uma supercategoria e não tem um pai.

+-------------------------------------------+
| item_categories                           |
+-------------------------------------------+
| id               | PK                     |
+------------------+------------------------+
| item_category_id | FK(item_categories.id) |
+------------------+------------------------+

É aqui que está minha pergunta. A doll_itemtabela é uma tabela dinâmica. Basicamente, um dollpode ter muitos itens e itempode pertencer a muitas bonecas. Mas há mais do que isso. Quero ter certeza de que, para cada doll, na doll_itemtabela, seu correspondente itemvem de uma categoria única.

Tentei puxar item_category_idpara itemem cada linha; no entanto, temo que essa relação não imponha que item_ide item_category_idda itemstabela venham necessariamente da mesma linha. Sem esse requisito, a adição das duas últimas linhas na doll_itemtabela é inútil.

É possível impor isso usando MySQL?

+-------------------------------------------------------+
| doll_item                                             |
+-------------------------------------------------------+
| doll_id              | FK(dolls.id)                   |
+----------------------+--------------------------------+
| item_id              | FK(items.id)                   |
+----------------------+--------------------------------+
| item_category_id     | FK(items.item_category_id)     |
+----------------------+--------------------------------+
| unique(doll_item.doll_id, doll_item.item_category_id) |
+-------------------------------------------------------+

obrigado

RandomSeed

Quero ter certeza de que, para cada boneca na doll_itemmesa, [cada] correspondente itemvem de uma categoria [diferente]

Use um composto UNIQUE KEY.

Temo que esta relação não impõe que o item_ide item_category_idda itemstabela venham necessariamente da mesma linha

Use um composto FOREIGN KEY.:

CREATE TABLE item (
  id INT NOT NULL,
  item_category_id INT NOT NULL,
  PRIMARY KEY (id),
  INDEX (id, item_category_id) -- see note below
);

CREATE TABLE doll_item (
  doll_id INT NOT NULL,
  item_id INT NOT NULL,
  item_category_id INT NOT NULL,
  PRIMARY KEY (doll_id, item_id),

  UNIQUE KEY (doll_id, item_category_id),

  FOREIGN KEY (item_id, item_category_id)
    REFERENCES item (id, item_category_id)

);

nota: na tabela referenciada, deve haver um índice onde as colunas referenciadas são listadas como as primeiras colunas na mesma ordem.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

quentelabel

Arquivo