2015-12-26 2 views
0

Я перенес проект из XAMP в VM-> Vagrant-> ubuntu/trusty64-> Установленный (php5-mysql mysql-server mysql -client)Невозможно создать таблицу из-за ограничения внешнего ключа, на ubuntu/trusty64 php5-mysql

Теперь, когда я пытаюсь создать свою БД и таблицы, я получаю следующую ошибку.

ОШИБКА Невозможно создать таблицу properties иностранное ограничение ключа неправильно сформировано. В ссылочной таблице нет индекса, где столбцы, на которые ссылаются, отображаются в качестве первых столбцов.

Это мой первый скрипт, поэтому я предполагаю, что есть некоторые ошибки, но все это работало нормально, когда я использовал XAMP. Я читал об используемых вами машинах и наборах символов, но я мало знаю об этом или как его редактировать в бродягах. Спасибо за всю помощь. Код ниже.

MySQL

CREATE TABLE `usertypes`(
`id` INT NOT NULL AUTO_INCREMENT, 
`type` CHAR(15), 
`permissions` CHAR(15), 
PRIMARY KEY (`id`) 
); 

INSERT INTO `usertypes`(`type`,`permissions`) VALUES ("Administrator", '{"Admin":1}'), ("Staff", '{"Staff":1}'), ("Basic", '{"Basic":1}'), ("Pro", '{"Pro":1}'), ("Business", '{"Business":1}'); 

CREATE TABLE `users` (
`id` INT PRIMARY KEY AUTO_INCREMENT, 
`username` VARCHAR (25) NOT NULL UNIQUE, 
`password` VARCHAR (60) NOT NULL, 
`usertype` INT NOT NULL DEFAULT 3, 
`email` varchar(40) NOT NULL, 
`authentication` varchar(32) NOT NULL, 
`active` smallint(1) NOT NULL DEFAULT 0, 
`newsletter` INT NOT NULL, 
`banned` SMALLINT NOT NULL DEFAULT 0, 
`user_since` DATE NOT NULL, 
`listings` INT DEFAULT 0, 
CONSTRAINT fk_usertype FOREIGN KEY (`usertype`) REFERENCES usertypes(`id`), 
UNIQUE KEY `users` (`username`,`email`) 
); 

CREATE TABLE `personal` (
`id` INT PRIMARY KEY, 
`first_name` VARCHAR (15) NULL, 
`last_name` VARCHAR (15) NULL, 
`mobile_phone` CHAR(10) NULL, 
`city` CHAR(25) NULL, 
`address` VARCHAR (100) NULL, 
`postal_code` VARCHAR(6) NULL, 
CONSTRAINT fk_personal FOREIGN KEY (`id`) 
REFERENCES users(`id`) 
); 

/* Create Properties table */ 
CREATE TABLE `propertytypes`(
`id` INT NOT NULL AUTO_INCREMENT, 
`type` CHAR(10), 
PRIMARY KEY (`id`) 
); 

INSERT INTO `propertytypes`(`type`) VALUES ("house"), ("duplex"), ("apartment"), ("townhouse"), ("4 plex"),("6 plex"), ("room"), ("commercial"), ("gathering halls"); 

CREATE TABLE `utilities`(
`id` INT NOT NULL AUTO_INCREMENT, 
`options` CHAR(10), 
PRIMARY KEY (`id`) 
); 

INSERT INTO `utilities`(`options`) VALUES ("None"),("Heat"), ("Electricity"), ("Water"), ("TV"), ("Internet"); 

CREATE TABLE `features`(
`id` INT NOT NULL AUTO_INCREMENT, 
`options` CHAR(10), 
PRIMARY KEY (`id`) 
); 

INSERT INTO `features`(`options`) VALUES ("Coin Laundry"), ("Own Laundry"), ("Jetted Tub/Jacuzzi"), ("Gym"), ("Pool"), ("Security"), ("Balcony"), ("Elevator"), ("Hardwood Floors"), ("Fenced Backyard"), ("Dishwasher"), ("Air Conditioning"), ("Laminate Floors"), ("Fire Pit"), ("Fireplace"), ("Wheelchair Access"), ("Storage Lockers"); 

CREATE TABLE `properties` (
`id` INT NOT NULL AUTO_INCREMENT, 
`owner` INT NOT NULL, 
`propertytype` INT NOT NULL, 
`address` varchar(255) NOT NULL, 
`postalcode` varchar(8) NOT NULL, 
`beds` INT(10), 
`baths` INT(10), 
`sqf` DECIMAL (6,2), 
`price` DECIMAL (6,2), 
`images` varchar(32), 
`listed` smallint(1) DEFAULT 2, 
`pets` smallint(1) DEFAULT 2, 
`kids` smallint(1) DEFAULT 2, 
`adults` smallint(1) DEFAULT 2, 
`utilities` INT NOT NULL DEFAULT 0, 
`features` INT NOT NULL DEFAULT 0, 
`parking` smallint(1) DEFAULT 2, 
`smokers` smallint(1) DEFAULT 2, 
`deposit` smallint(1) DEFAULT 0, 
`description` TEXT NOT NULL, 
PRIMARY KEY (`id`), 
CONSTRAINT fk_users FOREIGN KEY (`owner`) 
REFERENCES users(`id`), 
CONSTRAINT fk_propertytypes FOREIGN KEY (`propertytype`) 
REFERENCES propertytypes(`id`), 
CONSTRAINT fk_utilities FOREIGN KEY (`utilities`) 
REFERENCES utilities(`options`), 
CONSTRAINT fk_features FOREIGN KEY (`features`) 
REFERENCES features(`options`) 
); 

ответ

1

Это проходит весь путь через

Посмотрите на линии, которые говорят CHANGE MADE

Столбцы не были указаны правильно. Кроме того, было два столбца, которые усекались во время вставки.

create schema ff; -- create a new db 
use ff; -- now use that db 

CREATE TABLE `usertypes`(
`id` INT NOT NULL AUTO_INCREMENT, 
`type` CHAR(15), 
`permissions` CHAR(15), 
PRIMARY KEY (`id`) 
); 

INSERT INTO `usertypes`(`type`,`permissions`) VALUES ("Administrator", '{"Admin":1}'), ("Staff", '{"Staff":1}'), ("Basic", '{"Basic":1}'), ("Pro", '{"Pro":1}'), ("Business", '{"Business":1}'); 

CREATE TABLE `users` (
`id` INT PRIMARY KEY AUTO_INCREMENT, 
`username` VARCHAR (25) NOT NULL UNIQUE, 
`password` VARCHAR (60) NOT NULL, 
`usertype` INT NOT NULL DEFAULT 3, 
`email` varchar(40) NOT NULL, 
`authentication` varchar(32) NOT NULL, 
`active` smallint(1) NOT NULL DEFAULT 0, 
`newsletter` INT NOT NULL, 
`banned` SMALLINT NOT NULL DEFAULT 0, 
`user_since` DATE NOT NULL, 
`listings` INT DEFAULT 0, 
CONSTRAINT fk_usertype FOREIGN KEY (`usertype`) REFERENCES usertypes(`id`), 
UNIQUE KEY `users` (`username`,`email`) 
); 

CREATE TABLE `personal` (
`id` INT PRIMARY KEY, 
`first_name` VARCHAR (15) NULL, 
`last_name` VARCHAR (15) NULL, 
`mobile_phone` CHAR(10) NULL, 
`city` CHAR(25) NULL, 
`address` VARCHAR (100) NULL, 
`postal_code` VARCHAR(6) NULL, 
CONSTRAINT fk_personal FOREIGN KEY (`id`) 
REFERENCES users(`id`) 
); 

/* Create Properties table */ 
-- drop table propertytypes; 
CREATE TABLE `propertytypes`(
`id` INT NOT NULL AUTO_INCREMENT, 
`type` CHAR(40), -- CHANGE MADE ************************ 
PRIMARY KEY (`id`) 
); 

INSERT INTO `propertytypes`(`type`) VALUES ("house"), ("duplex"), ("apartment"), ("townhouse"), ("4 plex"),("6 plex"), ("room"), ("commercial"), ("gathering halls"); 

-- drop table utilities; 
CREATE TABLE `utilities`(
`id` INT NOT NULL AUTO_INCREMENT, 
`options` CHAR(40), -- CHANGE MADE ************************ 
PRIMARY KEY (`id`) 
); 

INSERT INTO `utilities`(`options`) VALUES ("None"),("Heat"), ("Electricity"), ("Water"), ("TV"), ("Internet"); 

CREATE TABLE `features`(
`id` INT NOT NULL AUTO_INCREMENT, 
`options` CHAR(40), -- CHANGE MADE ************************ 
PRIMARY KEY (`id`) 
); 

INSERT INTO `features`(`options`) VALUES ("Coin Laundry"), ("Own Laundry"), ("Jetted Tub/Jacuzzi"), ("Gym"), ("Pool"), ("Security"), ("Balcony"), ("Elevator"), ("Hardwood Floors"), ("Fenced Backyard"), ("Dishwasher"), ("Air Conditioning"), ("Laminate Floors"), ("Fire Pit"), ("Fireplace"), ("Wheelchair Access"), ("Storage Lockers"); 

CREATE TABLE `properties` (
`id` INT NOT NULL AUTO_INCREMENT, 
`owner` INT NOT NULL, 
`propertytype` INT NOT NULL, 
`address` varchar(255) NOT NULL, 
`postalcode` varchar(8) NOT NULL, 
`beds` INT(10), 
`baths` INT(10), 
`sqf` DECIMAL (6,2), 
`price` DECIMAL (6,2), 
`images` varchar(32), 
`listed` smallint(1) DEFAULT 2, 
`pets` smallint(1) DEFAULT 2, 
`kids` smallint(1) DEFAULT 2, 
`adults` smallint(1) DEFAULT 2, 
`utilities` INT NOT NULL DEFAULT 0, 
`features` INT NOT NULL DEFAULT 0, 
`parking` smallint(1) DEFAULT 2, 
`smokers` smallint(1) DEFAULT 2, 
`deposit` smallint(1) DEFAULT 0, 
`description` TEXT NOT NULL, 
PRIMARY KEY (`id`), 

CONSTRAINT fk_users FOREIGN KEY (`owner`) 
REFERENCES users(`id`), 

CONSTRAINT fk_propertytypes FOREIGN KEY (`propertytype`) 
REFERENCES propertytypes(`id`), 

CONSTRAINT fk_utilities FOREIGN KEY (`utilities`) 
REFERENCES utilities(`id`), -- CHANGE MADE ************************ 

CONSTRAINT fk_features FOREIGN KEY (`features`) 
REFERENCES features(`id`) -- CHANGE MADE ************************ 
); 

drop schema ff; -- drop test db (cleanup) 

Кроме того, рассмотреть вопрос удаления DEFAULT 0, если они будут конфликтовать с ограничением FK, который начинается с 1 и выше. Я откровенно не вижу смысла.

Из Руководства Page тузд под названием Using FOREIGN KEY Constraints

Соответствующие столбцы внешнего ключа и ссылочного ключа должно имеют схожие типы данных. Размер и знак целочисленных типов должны быть равны . Длина типов строк не обязательно должна быть одинаковой. Для строк небинных (символьных) строк, набор символов и сортировка должны быть одинаковыми.

и

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

+0

Спасибо, что имеет смысл Я понимаю это, однако вы могли бы рассказать мне, почему это будет работать в моей другой среде, а не в этом? Спасибо – IamCavic

+0

ну дно два FK были столбцами с несогласованными/unindexec столбцами для таблицы, на которую ссылается. Последняя таблица - это * ссылка * таблица. Он ссылается на таблицы * *. См. Нижнюю часть вопроса, где я добавил ссылку и некоторые материалы на странице руководства. – Drew

+0

Что касается вашей другой системы, кто знает. Я ничего об этом не знаю. – Drew

Смежные вопросы