WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL Error 1005 (Errno 150) (https://www.wn.se/forum/showthread.php?t=33249)

festiz 2008-11-12 21:25

Jag fattar inte riktigt varför detta inte går, vet inte om jag missar något, men visst ska väl två fält kunna referera till samma fält i en annan tabell? Och auto_increment räknas väl inte som data type på det sättet att det måste vara samma på både FK och det som FK pekar på?

#1005 - Can't create table './test/crm9_person.frm' (errno: 150)
Kod:

DROP TABLE IF EXISTS `crm9_address`;
CREATE TABLE `crm9_address` (
`id` int(255) NOT NULL auto_increment,
`address1` varchar(255) NOT NULL default '',
`address2` varchar(255) NOT NULL default '',
`zipcode` varchar(7) NOT NULL default '',
`city` varchar(40) NOT NULL default '',
`country` varchar(40) NOT NULL default '',
`mail` varchar(255) NOT NULL default '',
`gatecode` text,
`notes` text,
PRIMARY KEY (`id`) )ENGINE=INNODB;

DROP TABLE IF EXISTS `crm9_person`;
CREATE TABLE `crm9_person` (
`id` int(255) NOT NULL auto_increment,
`companyname` varchar(255) NOT NULL default '',
`contactname` varchar(255) NOT NULL default '',
`securitynumber` varchar(12) NOT NULL default '',
`cellphone` varchar(16) NOT NULL default '',
`telephone` varchar(16) NOT NULL default '',
`telefax` varchar(16) NOT NULL default '',
`on_call_address` int(255) NOT NULL default '0',
`invoice_address` int(255) NOT NULL default '0',
`custtype` int(11) default '3',
`granskad` int(255) default NULL,
`fakturatyp` int(10) default NULL,
`notes` text,
PRIMARY KEY (`id`),
INDEX (on_call_address, invoice_address),
CONSTRAINT person_has_address FOREIGN KEY (`on_call_address`, `invoice_address`)
REFERENCES crm9_address(id, id) ON UPDATE CASCADE ON DELETE RESTRICT )ENGINE=INNODB AUTO_INCREMENT=20;

Tacksam för hjälp! :)

MMC 2008-11-12 23:45

Kolla checkarna här: http://sql-info.de/mysql/referential-integrity.html

sixten 2008-11-12 23:45

Kan inte detta något vidare jag skulle prova med 2 constraints; 1 på varje.


Jag provade med följande. Korrekt, men Du kanske inte uppnår Dina syften.


DROP TABLE IF EXISTS `crm9_address`;
CREATE TABLE `crm9_address` (
`id` int(255) NOT NULL auto_increment,
`address1` varchar(255) NOT NULL default '',
`address2` varchar(255) NOT NULL default '',
`zipcode` varchar(7) NOT NULL default '',
`city` varchar(40) NOT NULL default '',
`country` varchar(40) NOT NULL default '',
`mail` varchar(255) NOT NULL default '',
`gatecode` text,
`notes` text,
PRIMARY KEY (`id`) )ENGINE=INNODB;

DROP TABLE IF EXISTS `crm9_person`;
CREATE TABLE `crm9_person` (
`id` int(255) NOT NULL auto_increment,
`companyname` varchar(255) NOT NULL default '',
`contactname` varchar(255) NOT NULL default '',
`securitynumber` varchar(12) NOT NULL default '',
`cellphone` varchar(16) NOT NULL default '',
`telephone` varchar(16) NOT NULL default '',
`telefax` varchar(16) NOT NULL default '',
`on_call_address` int(255) NOT NULL default '0',
`invoice_address` int(255) NOT NULL default '0',
`custtype` int(11) default '3',
`granskad` int(255) default NULL,
`fakturatyp` int(10) default NULL,
`notes` text,
PRIMARY KEY (`id`),
INDEX (on_call_address, invoice_address),
CONSTRAINT person_has_address_for_ONK FOREIGN KEY (`on_call_address`)
REFERENCES crm9_address(id) ON UPDATE CASCADE ON DELETE RESTRICT ,

CONSTRAINT person_has_address_for_INV FOREIGN KEY ( `invoice_address`)
REFERENCES crm9_address(id) ON UPDATE CASCADE ON DELETE RESTRICT
)
ENGINE=INNODB AUTO_INCREMENT=20;

HAVE IT!

coredev 2008-11-13 09:23

Om det skulle lösa problemen så fundera över om du kan klara dig utan dina FOREIGN KEYs. Vet att FOREIGN KEY låter bra i teorin, men behövs sällan i praktiken. :-)

festiz 2008-11-13 11:03

Citat:

Originally posted by sixten@Nov 13 2008, 00:45
Kan inte detta något vidare jag skulle prova med 2 constraints; 1 på varje.


Jag provade med följande. Korrekt, men Du kanske inte uppnår Dina syften.

INDEX (on_call_address, invoice_address),
CONSTRAINT person_has_address_for_ONK FOREIGN KEY (`on_call_address`)
REFERENCES crm9_address(id) ON UPDATE CASCADE ON DELETE RESTRICT ,

CONSTRAINT person_has_address_for_INV FOREIGN KEY ( `invoice_address`)
REFERENCES crm9_address(id) ON UPDATE CASCADE ON DELETE RESTRICT
)
HAVE IT!

Naturligtvis, den bygger ju 2 constraints och namnet på dessa måste vara unikt. Så det är ju klart att jag inte kan ha två fält pekandes mot samma under samma namn.


Alla tider är GMT +2. Klockan är nu 12:38.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson