Ограничение между несколькими столбцами разных таблиц в MySQL [duplicate]

Другой способ. Также сохранит ключи.

  function array_unique_multidimensional ($ input) {$ serialized = array_map ('serialize', $ input);  $ unique = array_unique ($ serialized);  return array_intersect_key ($ input, $ unique);  }  
44
задан James Skidmore 4 June 2009 в 22:05
поделиться

3 ответа

Что-то вроде этого должно это сделать:

  CREATE TABLE MyReferencingTable AS ([ОПРЕДЕЛЕНИЯ КОЛОНКИ] refcol1 INT NOT NULL, rofcol2 INT NOT NULL, CONSTRAINT fk_mrt_ot FOREIGN KEY (refcol1, refcol2) ССЫЛКИ  OtherTable (col1, col2)) ENGINE = InnoDB;   
  • MySQL требует, чтобы внешние ключи были проиндексированы, следовательно, индекс в ссылочных столбцах
  • Использование синтаксиса ограничений позволяет вам назвать ограничение, легче изменить и отбросить позже, если это необходимо.
  • InnoDB использует внешние ключи, MyISAM этого не делает. (Синтаксис анализируется, но игнорируется)
70
ответ дан PatrikAkerstrand 16 August 2018 в 02:19
поделиться
  • 1
    FWIW, MyISAM анализирует и игнорирует синтаксис внешнего ключа. И вам не нужно декларировать индекс избыточно с MySQL 4.1.2. – Bill Karwin 4 June 2009 в 23:11
  • 2
    Также убедитесь, что обе таблицы - InnoDB, поскольку, как отмечает Билл, MyISAM не поддерживает внешние ключи. – Abinadi 5 June 2009 в 04:28
  • 3
    Я был отклонен дважды из-за явного индекса? Суровая. Я заметил, что InnoDB был необходим. – PatrikAkerstrand 5 June 2009 в 06:50

В таблице может быть только один первичный ключ. Факт, в котором может состоять более чем из одного поля, не увеличивает количество первичных ключей, есть еще один.

Поскольку часть пары PK не уникальна, вам, очевидно, нужно создать внешний ключ, который ссылается к двум полям: ССЫЛКИ t1 (f1, f2).

3
ответ дан GSerg 16 August 2018 в 02:19
поделиться

Если мы хотим, чтобы логика для внешнего ключа выглядела как это

  FOREIGN KEY COmments (issue_id) ССЫЛКИ Ошибки (issue_id) ИЛИ FeatureRequests (issue_id)  

Пример:

  CREATE TABLE Issues (issue_id int PRIMARY KEY, статус VARCHAR (20));  CREATE TABLE Комментарии (comment_id int PRIMARY KEY, issue_type VARCHAR (20), - «Ошибки» или «FeatureRequests» issue_id BIGINT UNSIGNED NOT NULL, комментарий TEXT);  CREATE TABLE Ошибки (issue_id int PRIMARY KEY, серьезность VARCHAR (20), FOREIGN KEY (issue_id) ССЫЛКИ Проблемы (issue_id));  CREATE TABLE FeatureRequests (issue_id int PRIMARY KEY, спонсор VARCHAR (50), FOREIGN KEY (issue_id) ССЫЛКИ Проблемы (issue_id));  INSERT INTO VALUES (1, 'ON'), (2, 'ON'), (3, 'OFF'), (6, 'OFF'), (8, 'ON');  INSERT INTO Комментарии VALUES (1, 'Bugs', 1, 'A'), (2, 'Bugs', 3, 'B'), (3, 'Bugs', 1, 'C'), (4,  Bugs ', 3,' D '), (5,' FeatureRequests ', 8,' L '), (6,' FeatureRequests ', 6,' W '), (7,' FeatureRequests ', 1,' ZX '  );  INSERT INTO Bugs VALUES (1, 'severity_1'), (3, 'severity_for_3');  INSERT INTO FeatureRequests VALUES (2, 'sponsor_2 _'), (8, 'sponsor_for_8'), (1, 'sponsor_for_1')  

ВЫБОРЫ:

   MariaDB [test] & gt;  SELECT * FROM Комментарии JOIN FeatureRequests ON Комментарии.issue_i d = FeatureRequests.issue_id AND Comments.issue_type = 'FeatureRequests';  MariaDB [test] & gt;  SELECT * FROM Комментарии JOIN Bugs ON Комментарии.issue_id = Bugs.is sue_id AND Comments.issue_type = 'Bugs';  + ------------ + ------------ + ---------- + --------- + -  -------- + ---------------- + |  comment_id |  issue_type |  issue_id |  Комментарий |  issue_id |  серьезность |  + ------------ + ------------ + ---------- + --------- + -  -------- + ---------------- + |  1 |  Ошибки |  1 |  A |  1 |  severity_1 |  |  2 |  Ошибки |  3 |  B |  3 |  severity_for_3 |  |  3 |  Ошибки |  1 |  C |  1 |  severity_1 |  |  4 |  Ошибки |  3 |  D |  3 |  severity_for_3 |  + ------------ + ------------ + ---------- + --------- + -  -------- + ---------------- + 4 строки в наборе (0.00 сек)  
1
ответ дан zloctb 16 August 2018 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: