我在mySQL外键设置中做错了什么?

时间:2015-11-19 21:56:13

标签: mysql sql

解决了!在下面的单独帖子中回答

“无法添加外键约束”

仅在表Consist_of中使用代码时才会发生这种情况:

INDEX trade_name (trade_name),
  FOREIGN KEY (trade_name)
    REFERENCES Drug(trade_name)  
  ON DELETE CASCADE,
  PRIMARY KEY (pre_no, dssn, pname, trade_name)

如果我从trade_name取出PRIMARY KEY ()并删除INDEXCASCADE,代码,那么我的内容就会成功编译。我所要做的就是拥有它,以便我可以使用相同的名称输入Drug,并将唯一键设为pnametrade_name的组合

所有代码:

 CREATE TABLE Doctor (
dssn INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
dname VARCHAR(30),
specialty VARCHAR(30)
);

CREATE TABLE Prescription (
  pre_no INT(6) UNSIGNED PRIMARY KEY,
  dssn INT(6) UNSIGNED,
  INDEX dssn (dssn),
  FOREIGN KEY (dssn)
    REFERENCES Doctor(dssn)
    ON DELETE CASCADE,
  pdate DATETIME
);

CREATE Table Ph_company (
  pname varchar(30) PRIMARY KEY,
  phone varchar(12)
);

CREATE Table Drug (
  pname varchar(30), 
  trade_name VARCHAR(30),
  formula VARCHAR(30),
  INDEX pname (pname),
  FOREIGN KEY (pname)
    REFERENCES Ph_company(pname)
    ON DELETE CASCADE,
   key(pname, trade_name)
);



CREATE Table Consist_of (
  pre_no INT(6) UNSIGNED,
  dssn INT(6) UNSIGNED,
  pname varchar(30), 
  trade_name VARCHAR(30),
  INDEX pre_no (pre_no),
  FOREIGN KEY (pre_no)
           REFERENCES Prescription(pre_no)
           ON DELETE CASCADE,
  INDEX dssn (dssn),
  FOREIGN KEY (dssn)
           REFERENCES Prescription(dssn)
           ON DELETE CASCADE,
  INDEX pname (pname),
  FOREIGN KEY (pname)
    REFERENCES Drug(pname)
    ON DELETE CASCADE,
  INDEX trade_name (trade_name),
  FOREIGN KEY (trade_name)
    REFERENCES Drug(trade_name)
    ON DELETE CASCADE,
  PRIMARY KEY (pre_no, dssn, pname, trade_name)

);

2 个答案:

答案 0 :(得分:0)

由于DRUG中的主键是由2个字段组成的复合键,因此必须以相同的方式设置外键。因此,不是声明2个外键(1表示pname而另一个表示trade_name),而是执行此操作:

FOREIGN KEY ('pname','trade_name') 
    REFERENCES Drug('pname','trade_name')

答案 1 :(得分:0)

数据显示,经过2个小时的敲击后,我在问你们这里2分钟后找出解决方案(我想)。

我添加了

int guessedLetters = 0; int guessLeft = 5; while (guessLeft < 0 || guessedLetters == fileWord.length()) { char guessInput; cout << "\nEnter a letter to guess: "; cin >> guessInput; guessInput = toupper(guessInput); cout << "You guessed the letter: " << guessInput<< endl; for (int i = 0; i < fileWord.length(); i++) { if (fileWord[i] == guessInput) { cout << wrongGuess << " is in the letter to guess." << endl; guessedLetters++; found = true; } } // if not found - increment wrong guesses if (!found) { guessLeft--; cout << guessInput << " is not in the word to guess." << endl; } //print the board that corresponds to the wrongGuess }

INDEX trade_name (trade_name), key(pname, trade_name)创建代码的末尾,它现在有效,允许我输入重复的药物名称。