2016-06-22 4 views
0

외래 키를 적용하는 중 "외래 키 제약 조건을 추가 할 수 없습니다."오류가 발생합니다.MySQL에서 외래 키 제약 조건을 추가 할 수 없습니다.

그렇지 않으면 쿼리가 정상적으로 작동합니다. MySQL 쿼리의 구문에서 그다지 문제가없는 것처럼 보입니다.

 //Department Table 
       query = "CREATE TABLE IF NOT EXISTS department " 
        + "(" 
        + "dept_id INT PRIMARY KEY AUTO_INCREMENT," 
        + "dept_name VARCHAR(40) NOT NULL" 
        + ")ENGINE=InnoDB"; 
       command = new MySqlCommand(query, connection); 
       command.ExecuteNonQuery(); 

       //Designation Table 
       query = "CREATE TABLE IF NOT EXISTS designation " 
        + "(" 
        + "desig_id INT PRIMARY KEY AUTO_INCREMENT," 
        + "designation VARCHAR(40) NOT NULL" 
        + ")ENGINE=InnoDB"; 
       command = new MySqlCommand(query, connection); 
       command.ExecuteNonQuery(); 

       // PayNature Table 
       query = "CREATE TABLE IF NOT EXISTS paynature " 
        + "(" 
        + "paynature_id INT PRIMARY KEY AUTO_INCREMENT," 
        + "pay_nature VARCHAR(40) NOT NULL" 
        + ")ENGINE=InnoDB"; 
       command = new MySqlCommand(query, connection); 
       command.ExecuteNonQuery(); 

       // Employee Type 
       query = "CREATE TABLE IF NOT EXISTS employeetype " 
        + "(" 
        + "emptype_id INT PRIMARY KEY AUTO_INCREMENT," 
        + "emp_type VARCHAR(40) NOT NULL" 
        + ")ENGINE=InnoDB"; 
       command = new MySqlCommand(query, connection); 
       command.ExecuteNonQuery(); 

       // Pay Scale Table 
       query = "CREATE TABLE IF NOT EXISTS payscale " 
        + "(" 
        + "payscale_id INT PRIMARY KEY AUTO_INCREMENT," 
        + "payscale VARCHAR(40) NOT NULL, " // Optional 
        + "basic_salary DEC(10,3) NOT NULL" 
        + ")ENGINE=InnoDB"; 
       command = new MySqlCommand(query, connection); 
       command.ExecuteNonQuery(); 

       // Employee Table 
       query = "CREATE TABLE IF NOT EXISTS employee " 
        + "(" 
        + "emp_id INT PRIMARY KEY AUTO_INCREMENT," 
        + "emp_name VARCHAR(40) NOT NULL," 
        + "emptype_id_fk VARCHAR(40)," //Optional 
        + "dept_id_fk INT," //Optional 
        + "desig_id_fk INT," //Optional 
        + "payscale_id_fk INT NOT NULL, " 
        + "INDEX(emptype_id_fk, dept_id_fk, desig_id_fk, payscale_id_fk)," 

        //Employee - R - EmployeeType 
        + "FOREIGN KEY(emptype_id_fk)" 
        + "REFERENCES employeetype(emptype_id)" 
        + "ON UPDATE CASCADE," 

        // Employee - R - Department 
        + "FOREIGN KEY(dept_id_fk)" 
        + "REFERENCES department(dept_id)" 
        + "ON DELETE SET NULL ON UPDATE CASCADE," 


        // Employee - R- Designation 
        + "FOREIGN KEY(desig_id_fk)" 
        + "REFERENCES designation(desig_id)" 
        + "ON DELETE SET NULL ON UPDATE CASCADE ," 

        // Employee - R - Payscale 
        + "FOREIGN KEY(payscale_id_fk)" 
        + "REFERENCES payscale(payscale_id)" 
        + "ON DELETE CASCADE ON UPDATE CASCADE" 
        + ")ENGINE=InnoDB"; 

       command = new MySqlCommand(query, connection); 
       command.ExecuteNonQuery(); 
+0

게시물에 오류를 포함 시켰습니까? 나는 그것을 볼 수 없다. – totalfreakingnoob

+0

안녕하세요, 외래 키를 정의 할 때 테이블 유료화를 만든 다음 payscale 테이블을 참조하는 것 같습니다. 그것들이 같은 테이블이되어야하는지 확신 할 수 없습니까? – Gilles

답변

1

그냥 첫 번째 것을 보았습니다.

"emptype_id_fk VARCHAR(40)," 
..... 
+ "FOREIGN KEY(emptype_id_fk)" 
+ "REFERENCES employeetype(emptype_id)" 
.... 

그러나 employeetype 테이블의 emptype_id 필드가 INT

(11)로 선언 아마 당신은 INT가되도록 employee 테이블의 필드 emptype_id_fk를 원한다.
이 변경 후 쿼리가 작동합니다

+0

예, 바보였습니다! 감사합니다. –