2016-07-26 75 views
0

當我要執行這個代碼,我收到此錯誤信息:MySQL的外鍵約束語法

您的SQL語法錯誤;檢查 對應於你的MySQL服務器版本正確的語法使用 附近手冊「添加約束fk_pay_grade_scale FOREIGN KEY pay_scale_id 參考`pay_s」在第11

但我不明白的問題。感謝您的幫助!

 
CREATE TABLE IF NOT EXISTS `pay_grades` (
    `pay_grade_id` int(20) NOT NULL, 
    `pay_scale_id` tinyint(4) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `basic_salary` decimal(10,2) NOT NULL, 
    `status` int(2) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`pay_grade_id`), 
    INDEX (`pay_scale_id`, `pay_grade_id`), 
    ADD CONSTRAINT `fk_pay_grade_scale` FOREIGN KEY `pay_scale_id` REFERENCES `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `pay_scales` (
`id` tinyint(4) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    PRIMARY KEY(id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

回答

3

CREATE TABLE聲明不能使用ADD CONSTRAINT。 在創建表格後或在CREATE TABLE中聲明約束。


解決方案一:加約束的CREATE TABLE

CREATE TABLE IF NOT EXISTS `pay_grades` (
    `pay_grade_id` int(20) NOT NULL, 
    `pay_scale_id` tinyint(4) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `basic_salary` decimal(10,2) NOT NULL, 
    `status` int(2) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`pay_grade_id`), 
    INDEX (`pay_scale_id`, `pay_grade_id`), 
    FOREIGN KEY (`pay_scale_id`) REFERENCES `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

解決方法二:ALTER TABLE添加約束

創建你的表沒有約束,然後添加您的約束如下:

ALTER TABLE `pay_grades` 
ADD CONSTRAINT `pay_scale_id` FOREIGN KEY REFERENCES `pay_scales`(`id`) 
ON UPDATE CASCADE ON DELETE RESTRICT; 

MySQL documentation用於外鍵聲明。

+0

是的,我接受:) –

+1

@zamansarker接受一個答案表示單擊旁邊的答案小刻度線。如果其他答案是有用的,你也應該考慮提高它們。更多詳情,請訪問http://stackoverflow.com/help/someone-answers – e4c5

0

這似乎是表創建順序的差異。首先創建主鍵表,而不是創建外鍵表。

CREATE TABLE IF NOT EXISTS `pay_scales` (
`id` tinyint(4) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    PRIMARY KEY(id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `pay_grades` (
    `pay_grade_id` int(20) NOT NULL, 
    `pay_scale_id` tinyint(4) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `basic_salary` decimal(10,2) NOT NULL, 
    `status` int(2) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`pay_grade_id`), 
    INDEX (`pay_scale_id`, `pay_grade_id`), 
    ADD CONSTRAINT `fk_pay_grade_scale` FOREIGN KEY `pay_scale_id` REFERENCES `pay_scales`(`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;