Mysql
 sql >> база данни >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Неуспешно добавяне на ограничението за външен ключ. Липсващ индекс за ограничение

Първо се опитайте да анализирате и разберете вашата схема. Не виждам причина защо teamname трябва да бъде част от първичния ключ. ID колоната вече е уникална поради AUTO_INCREMENT опция. Така че можете просто да го направите първичен ключ.

Сега анализирайте ограниченията за teamname . Ако два отбора не могат да имат едно и също име, тогава трябва да дефинирате UNIQUE KEY ограничение за teamname . Ако всеки отбор трябва да има име, тогава трябва да дефинирате NOT NULL ограничение за teamname . С тези ограничения teams може да бъде създаден като:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

Сега можете да използвате teamname колона, за да идентифицирате ред в teams таблица и може да я използва като външен ключ в други таблици. Вашият код за players таблицата вече трябва да работи (вижте демото ).

Имайте предвид, че обикновено външният ключ препраща към първичен ключ на друга таблица. players таблицата ще бъде дефинирана като:

CREATE TABLE IF NOT EXISTS players (
  ID INT NOT NULL AUTO_INCREMENT,
  player_name VARCHAR(255),
  cm INT NOT NULL,
  team_id INT,
  PRIMARY KEY (ID),
  FOREIGN KEY (team_id) REFERENCES teams(ID)
);

Когато трябва да знаете името на отбора на играч, ще използвате JOIN:

SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

Забележка:През последните няколко дни виждах въпроси със същия модел отново и отново. Моделът е:Външен ключ, който препраща към част от първичния ключ в друга таблица. Някои примери:

Коментари и отговори, предложени да се дефинира прост индекс в посочената таблица, за да се поддържа проверката на FK ограничението. Не правете това! Помислете дали се опитате да решите проблема си, като просто дефинирате индекс на teamname на teams таблица с:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

MySQL ще приеме това (вижте демонстрация ). Но вашата схема позволява два отбора с едно и също име. Ако приемем, че имате два отбора с името "маймуни". И имате играч, който има "маймуни" като име на отбор (FK). Кой от двата отбора е посочен? Не можеш да кажеш! Така че по-добре се придържайте към прости правила. И правилото за външните ключове е:Позовавайте се само на пълни УНИКАЛНИ или ПЪРВИЧНИ КЛЮЧОВЕ. Или още по-просто:препращайте само към пълните ПЪРВИЧНИ КЛЮЧОВЕ. Стойността на външния ключ трябва да идентифицира конкретен ред в посочената таблица.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да изведа резултати от MySQL заявка във формат CSV?

  2. Вмъкване в select и актуализиране в една заявка

  3. Броят на колоните не съвпада с броя на стойностите на ред 1

  4. Как да създам последователност в MySQL?

  5. актуализира колона чрез изваждане на стойност