webForumDet fria alternativet

Radera flera tabeller

Databaser & SQL

12 svar · 634 visningar · startad av Oputres

Medlem sedan feb. 2004333 inlägg
Frågan#1

Allå!

Detta trodde ju jag skulle gå:

Conn.Execute("Delete * From Tabell1, Tabell2, Tabell3, Tabell4 Where AnvId = '" & RSAnvandare("AnvId") & "';"),, 128

I alla tabeller finns kolumnen AnvId för att knyta posten till användaren och jag fill alltså ta bort alla poster i alla tabeller där AnvId = RSAnvandare("AnvId").

På denna rad får jag dock följande felmeddelande:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Microsoft][ODBC Microsoft Access Driver] Specify the table containing the records you want to delete.

Kan man inte ta bort flera tabeller samtidigt i Access?

Medlem sedan dec. 200012 464 inlägg
#2

Det går inte att ange flera tabellnamn i en deletesats.

Definera foreign key med on delete cascade och gör sedan delete i huvudtabellen.

Flyttas från ASP

Medlem sedan aug. 20039 340 inlägg
#3

Bara en tanke, borde det inte vara delete from snarare än delete * from?

Medlem sedan dec. 200012 464 inlägg
#4

Access tillåter delete *, det går inte i andra DBMS.

Medlem sedan feb. 2004333 inlägg
#5

LarsG skrev:

Det går inte att ange flera tabellnamn i en deletesats.

Definera foreign key med on delete cascade och gör sedan delete i huvudtabellen.

Flyttas från ASP

Eeh, hur gör man det? :q

Medlem sedan feb. 2004333 inlägg
#6

nitro2k01 skrev:

Bara en tanke, borde det inte vara delete from snarare än delete * from?

Hmm, skall det? Anger inte * att den skall ta bort alla kolumner, precis som med Select? Det fungerar i alla fall men är det fel?

Medlem sedan dec. 200012 464 inlägg
#7

Då delete alltid tar bort hela rader så fyller * ingen funktion. Så jag tycker att du skall ta bort det. Enda problemet är att äldre versioner av Access kräver att man skriver delete *

create table pk(c1 int primary key)

create table fk(c1 int)

-- lägg till foreign key

alter table fk add foreign key(c1) references pk on delete cascade

om du nu gör en delete från pk så kommer relaterade rader i fk att tas bort.

Det finns säkert något tjusigt grafiskt interface för detta i Access.

Medlem sedan feb. 2004333 inlägg
#8

LarsG skrev:

Då delete alltid tar bort hela rader så fyller * ingen funktion. Så jag tycker att du skall ta bort det. Enda problemet är att äldre versioner av Access kräver att man skriver delete *

create table pk(c1 int primary key)

create table fk(c1 int)

-- lägg till foreign key

alter table fk add foreign key(c1) references pk on delete cascade

om du nu gör en delete från pk så kommer relaterade rader i fk att tas bort.

Det finns säkert något tjusigt grafiskt interface för detta i Access.

Nu är jag inte så himla duktig på databaser men är det här något i stil med Relationer? Om jag skapar relationer (är bara van att arbeta grafiskt i Access) kommer det då bli samma effekt? Man måste inte ange någon speciell delete-sats när man vill radera utan istället har man ställt in detta samband redan från början, d.v.s. att om jag tar bort en tabell så skall de andra också tas bort, eller?

Medlem sedan dec. 200012 464 inlägg
#9

Nu är jag inte så himla duktig på databaser men är det här något i stil med Relationer?

Jo.

Om jag skapar relationer (är bara van att arbeta grafiskt i Access) kommer det då bli samma effekt?

Jo.

Man måste inte ange någon speciell delete-sats när man vill radera utan istället har man ställt in detta samband redan från början, d.v.s. att om jag tar bort en tabell så skall de andra också tas bort, eller?

Jo.

Du skriver

tar bort en tabell

men jag förutsätter att du menar post.

Medlem sedan feb. 2004333 inlägg
#10

Oki. Jag hoppas du orkar lite till, det här låter som det bästa att göra (nödlösningen blir en delete-sats för varje post men det blir jobbigt att komma ihåg att ändra i denna fil om jag gör ändringar).

Vi plockar tre tabeller: AnvDb, Lankar och Protokoll.

I tabellen AnvDb finns AnvId som primärnyckel och används för att identifiera posterna i samtliga tabeller till användaren. I alla andra tabeller återfinns således denna som referensnyckel.

Jag öppnar databasen, klickar på Relationer och lägger till ovannämnda tabeller. Skall jag nu dra primärnyckeln AnvId i tabellen AnvDb till de olika AnvId-posterna i övriga tabellerna? Jag får som standard upp 1:N, blir det bra? (jag kommer inte ihåg de olika referenstyperna. Därefter klickar jag i Referensintegritet följt av "Ta bort poster i relaterade tabeller".

Är jag fit for fight efter detta? Om jag nu anger SQL-satsen Delete From AnvDb Where AnvId = '" & strAnvId & "';"),, 128 kommer då alla relaterade tabeller raderas på poster med denna referensnyckel?

Medlem sedan dec. 200012 464 inlägg
#11

Jag har aldrig använt access men enligt din beskrivning borde det vara rätt.

Medlem sedan sep. 2003110 inlägg
#12

Oputres, vet inte om detta löser sig för dig. Men denna VBA-kod är kanske en början?
Ta bort kommentar fnutten ' vid setwarnings för att ta bort konfirmations-rutan om radering(ar).

'DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM AnvDb WHERE AnvDb.AnvId='" & strAnvid "';"
DoCmd.RunSQL "DELETE * FROM Lankar WHERE Lankar.AnvId='" & strAnvid "';"
DoCmd.RunSQL "DELETE * FROM Protokoll WHERE Protokoll.AnvId='" & strAnvid "';"
'DoCmd.SetWarnings True

Medlem sedan feb. 2004333 inlägg
#13

Det fungerade inte riktigt med relationerna eftersom det var olika datatyper (ReplikeringsID/räknare i AnvDb och text i övriga). Jag skrev en Delete-sats för varje tabell istället. Inte det smidigaste men jag vill inte ändra för mycket i databasen.

283 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)