Portál AbcLinuxu, 12. května 2025 19:26

Dotaz: MySQL a foreign keys

svido avatar 16.3.2014 10:37 svido | skóre: 28
MySQL a foreign keys
Přečteno: 867×
Odpovědět | Admin
Ahoj, bohužel už několik jsem nenavrhoval DB, takže jsem dost zapomněl, ale i tak by definice cizích klíčů měla být v pořádku. Ale není, pokud chci vymazat tabulku `User`, tak dostanu hlášku: "#1701 - Cannot truncate a table referenced in a foreign key constraint (`golf_portal`.`User2Newsletter`, CONSTRAINT `fk_User2Newsletter_User1` FOREIGN KEY (`UserID`) REFERENCES `golf_portal`.`User` (`id`))"

Děkuji za kažou radu, já to fakt nevidím... :-(
CREATE TABLE `User` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `AccountStateID` tinyint(3) unsigned NOT NULL,
  `Email` varchar(128) NOT NULL,
  `CityID` int(10) unsigned DEFAULT NULL,
  `Name` varchar(64) NOT NULL,
  `Surname` varchar(64) NOT NULL,
  `Password` char(40) NOT NULL,
  `IsActive` tinyint(1) NOT NULL DEFAULT '0',
  `Phone` varchar(32) DEFAULT NULL,
  `LinkedInUrl` varchar(128) DEFAULT NULL,
  `CgfID` int(10) unsigned DEFAULT NULL,
  `HCP` smallint(5) unsigned DEFAULT NULL,
  `Salt` char(40) DEFAULT NULL,
  `ActivationCode` char(40) DEFAULT NULL,
  `Created` int(10) unsigned NOT NULL,
  `Modified` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unq_Email` (`Email`),
  UNIQUE KEY `unq_CgfID` (`CgfID`),
  KEY `fk_User_CodeCity1_idx` (`CityID`),
  KEY `fk_User_UserAccountState1_idx` (`AccountStateID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `User2Newsletter` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `UserID` int(10) unsigned NOT NULL,
  `IsActive` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unq_UserID` (`UserID`),
  KEY `fk_User2Newsletter_User1_idx` (`UserID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Constraints for dumped tables
--

ALTER TABLE `User`
  ADD CONSTRAINT `fk_User_CodeCity1` FOREIGN KEY (`CityID`) REFERENCES `CodeCity` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_User_CodeUserAccountState1` FOREIGN KEY (`AccountStateID`) REFERENCES `CodeUserAccountState` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `User2Newsletter`
  ADD CONSTRAINT `fk_User2Newsletter_User1` FOREIGN KEY (`UserID`) REFERENCES `User` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.3.2014 11:41 jekub
Rozbalit Rozbalit vše Re: MySQL a foreign keys
Odpovědět | | Sbalit | Link | Blokovat | Admin
#1701 - Cannot truncate

Nemůžete použít truncate na tabulku User, pokud User2Newsletter obsahuje data.

Použijte delete, nebo nejprve truncate User2Newsletter.
svido avatar 16.3.2014 12:32 svido | skóre: 28
Rozbalit Rozbalit vše Re: MySQL a foreign keys
Já měl za to, že to dříve fungovalo. Truncate je v podstatě jako delete - jsem myslel a předpokládal jsem, že si constrainty poradi. Přijde mi to dost divný, když budu mít třeba 50 tabulek s cizimi klici z jedné tabulky, tak mi přijde nelogické dávat truncate na tabulkach co maji cizi klic nebo mazat jednotlive
16.3.2014 13:03 jekub
Rozbalit Rozbalit vše Re: MySQL a foreign keys
truncate - DDL, delete - DML
17.3.2014 09:45 axel
Rozbalit Rozbalit vše Re: MySQL a foreign keys
Jestli to drive fungovalo nevim, ale truncate rozhodne neni "jako delete", na to si dej pozor.
17.3.2014 11:42 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: MySQL a foreign keys

TRUNCATEje operace „údržbová“ nebo-li pracující ze strukturou, ne s daty (i když je zlikviduje) dala by se popsat jako DROP TABLE a CREATE TABLE.

DELETE FROM table bez WHERE clausule smaže všechny data, a neřekl bych, že jednotlivě, pro každý záznam se provede to co má, ale jsou smazány všechny (ale k uvolnění místa na disku pravděpodobně nedojde, lze následně použít optimize table, nebo zmíněné truncate jako údržbu DB).

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
22.3.2014 10:25 Filip Jirsák
Rozbalit Rozbalit vše Re: MySQL a foreign keys
Delete při mazání provádí všechny kontroly, např. abyste nesmazal řádek, na který odkazuje cizí klíč z jiné tabulky. Truncate se jednotlivými řádky nezabývá, smaže všechna data z tabulky. Takže musí mít jistotu, že jsou všechny kontroly splněné - tedy například že se tím vyprázdnění tabulky nesmaže záznam, na který by odkazoval cizí klíč z jiné tabulky.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.