Trim stalas su ribotu užsienio raktu

Kodėl TRUNCATE veikia mano mygroup ? Net jei turiu „ ON DELETE CASCADE SET , gaunu:

ERROR 1701 (42000): mytest sutrumpinti lentelės, kuriai mytest užsienio raktų suvaržymas ( mytest . Instancija, mytest instance_ibfk_1 UŽSIENIO KEY ( GroupID ) NUORODOS mytest .

 drop database mytest; create database mytest; use mytest; CREATE TABLE mygroup ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE=InnoDB; CREATE TABLE instance ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, GroupID INT NOT NULL, DateTime DATETIME DEFAULT NULL, FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE, UNIQUE(GroupID) ) ENGINE=InnoDB; 
408
28 марта '11 в 0:57 2011-03-28 00:57 user391986 yra nustatytas kovo 28 d . 11, 0:57 2011-03-28 00:57
@ 7 atsakymai

Negalite TRUNCATE lentelės su FK apribojimais ( TRUNCATE neatitinka DELETE ).

Norėdami tai padaryti, naudokite bet kurį iš šių sprendimų. Abi šalys kelia grėsmę duomenų vientisumui.

1 variantas:

  • Pašalinti apribojimus
  • Paleiskite TRUNCATE
  • Rankiniu būdu ištrinkite linijas, kuriose dabar yra nuorodų į niekur
  • Sukurti apribojimus

2 variantas: vartotojo447951 pasiūlytas atsakymas

 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table $table_name; SET FOREIGN_KEY_CHECKS = 1; 
567
28 марта '11 в 1:03 2011-03-28 01:03 atsakymas pateikiamas zerkms kovo 28 '11 1:03 2011-03-28 01:03

Taip, galite:

 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table1; TRUNCATE table2; SET FOREIGN_KEY_CHECKS = 1; 

Su šiais teiginiais rizikuojate į lenteles įtraukti eilutes, kurios neatitinka FOREIGN KEY .

947
10 нояб. atsakymą pateikė user447951 10 Lap. 2011-11-10 06:02 '11 at 6:02 2011-11-10 06:02

Aš tiesiog tai padaryčiau

 DELETE FROM mytest.instance; ALTER TABLE mytest.instance AUTO_INCREMENT = 1; 
98
24 сент. George Garchagudashvili atsakymas 24 Sep. 2014-09-24 14:05 '14, 14:05, 2014-09-24 14:05

Pagal „ MySQL“ dokumentaciją TRUNCATE negalima naudoti lentelėse su užsienio pagrindiniais ryšiais. AFAIK nėra visiškai alternatyvi.

Kontrasto nuleidimas vis dar nesukelia ON. IŠJUNGIMAS ir UPDATE. Vienintelis sprendimas, kurį galiu naudoti, yra:

  • ištrinkite visas eilutes, ištrinkite užsienio raktus, apdailinkite, atkurkite raktus
  • ištrinti visas eilutes, iš naujo nustatyti automatinį padidinimą (jei naudojamas)

Atrodo, kad „TRUNCATE“ „MySQL“ dar nėra visapusiška funkcija (ji taip pat neskambina trigeriais). Žr. Komentarą

10
16 окт. atsakymą Omer Sabic pateikė spalio 16 d. 2012-10-16 12:20 '12 12:20 2012-10-16 12:20

galite padaryti

 DELETE FROM `mytable` WHERE `id` > 0 
3
13 мая '17 в 16:20 2017-05-13 16:20 atsakymą pateikė Ali Sadran , gegužės 13 d. 17, 16:20

Nors šis klausimas buvo užduotas daugiau nei prieš 5 metus, ir aš nežinau, kad šis įrankis egzistavo „MySql“, bet dabar, jei naudojate phpmyadmin , galite tiesiog atidaryti duomenų bazę ir tada pasirinkti lentelę (-es), kurią norite sutrumpinti. Žemiau yra išskleidžiamajame meniu su daugybe parinkčių. Atidarykite jį ir po antrašte „ Ištrinti duomenis ar lentelę“ pasirinkite „ Tuščia“ . Jis automatiškai perkelia jus į kitą puslapį, kuriame yra žymimasis laukelis Įjungti užsienio raktą. Tiesiog panaikinkite pasirinkimą ir spustelėkite mygtuką „Taip“, o pasirinkta lentelė (-ės) bus sutrumpinta. Galbūt jis viduje atlieka vartotojo447951 pasiūlytą užklausą. Bet tai labai patogu naudoti iš phpmyadmin sąsajos.

2
22 дек. Atsakymą pateikė Rolen Koh gruodžio 22 d. 2016-12-22 14:41 '16 at 14:41 pm 2016-12-22 14:41

Atsakymas iš tiesų yra tas, kurį teikia „ zerkms“ , kaip nurodyta 1 variante :

1 galimybė : tai nepažeis duomenų vientisumo:

  • Pašalinti apribojimus
  • Paleiskite TRUNCATE
  • Rankiniu būdu ištrinkite linijas, kurios dabar yra nuorodos bet kur.
  • Sukurti apribojimus

Sunku dalimi pašalinami apribojimai , todėl noriu jums pasakyti, kaip, jei kas nors turėtų žinoti, kaip tai padaryti:

  • Paleiskite SHOW CREATE TABLE <Table Name> užklausą, kad sužinotumėte, koks jūsų vardas yra UŽSIENIO KEY (raudonas rėmelis apačioje):

    2019

24 нояб. Atsakymą pateikė Trix 24 lapkričio. 2016-11-24 22:15 '16 at 10:15 pm 2016-11-24 22:15