0

私はツリーテーブルMySQLを持っています:

記事テーブルには以下が含まれます:

id int
title varchar(255)
...

ニューステーブルには以下が含まれます:

id int
title varchar(255)
...

コメント テーブルには以下が含まれます。

id int
content text
type tinyint(1)  //this column holds 0 if this comment for news and holds 1 for article
fid  int         // this column holds id of article or news 

コメント テーブルから記事やニュースへの外部キーを作成するにはどうすればよいですか。つまり、MySQL クエリでこれを実装する方法は次のとおりです。

if type=0 then
 FOREIGN KEY (fid) REFERENCES news(id)

if type=1 then
 FOREIGN KEY (fid) REFERENCES articles(id)
4

2 に答える 2

1

できません。ここで外部キー制約について読むことができます.1つのテーブルしか許可されていないことに注意してください.

1 つの回避策は、個別の ID に対して個別の列を用意することです。

id int
content text
type tinyint(1)   //this column holds 0 if this comment for news and holds 1 for article
articleid  int
newsid int
. . . 
foreign key (articleid) references articles(id)
foreign key (newsid) references news(id)

実際には、 を省略して、type任意の時点で 1 つの ID のみを設定できるという制約 (トリガーによって実装) を追加できます。

于 2013-06-16T17:53:44.760 に答える
1

適切な PK-FK 関係を持つには、スーパーセット テーブルを使用することをお勧めします (それを と呼びましょうposts)。その場合、スキーマは次のようになります

CREATE TABLE posts 
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  type TINYINT(1)
);

CREATE TABLE articles
(
  id INT NOT NULL,
  title VARCHAR (255),
  article_property VARCHAR(128),
  -- other article specific attributes
  CONSTRAINT FOREIGN KEY (id) REFERENCES posts (id)
);

CREATE TABLE news
(
  id INT NOT NULL,
  title VARCHAR (255),
  reporter VARCHAR(128),
  -- other news specific attributes
  CONSTRAINT FOREIGN KEY (id) REFERENCES posts (id)
);

CREATE TABLE comments
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  post_id INT NOT NULL,
  content TEXT,
  CONSTRAINT FOREIGN KEY (post_id) REFERENCES posts (id)  
);

id新しい記事やニュースを挿入するときに sを入力するには、トリガーを利用できます

DELIMITER $$
CREATE TRIGGER tg_article_insert 
BEFORE INSERT ON articles
FOR EACH ROW
BEGIN
  INSERT INTO posts (type) VALUES (1);
  SET NEW.id = LAST_INSERT_ID();
END$$

CREATE TRIGGER tg_news_insert 
BEFORE INSERT ON news
FOR EACH ROW
BEGIN
  INSERT INTO posts (type) VALUES (0);
  SET NEW.id = LAST_INSERT_ID();
END$$
DELIMITER ;

これがSQLFiddle のデモです。

于 2013-06-16T17:53:08.477 に答える