Avatar billede donnib Nybegynder
22. januar 2004 - 09:53 Der er 16 kommentarer og
1 løsning

Compare af to tabeller med nogle tilhørende problemer

Hej alle,
Jeg har to tabeller Tabel1 og Tabel2. Som ser præcis ud til at starte med dvs de indeholder også samme data. På et tidspunkt vil jeg gerne addere en record til Tabel2 men det jeg rent faktisk gør er at jeg sletter alle records i tabellen og derefter indsætter dem igen i Tabel2 og det er for at have en bestemt rækkefølge. Det skal nævnes at tabel to har ingen referancer til andre tabeller i databasen dvs. jeg kan sagtens slette uden at rode noget til hvorimod Tabel1 har referencer til en masse tabeller så jeg kan ikke slette noget. Det jeg gerne vil have nu er at jeg vil have den samme rækkefølge som jeg har i Tabel2 i Tabel1. Problemet er hvordan får jeg lov til at ændre i Tabel1 uden at den begynder at klage over de referencer som bliver brugt i andre tabeller ? Kan jeg ændre oplysningerne og lave om i rækkefølgen og dermed opdatere de primære nøgler som bliver brugt i de andre tabeller i databasen ? Jeg ved ikke om i forstår hvad jeg mener men der er vigtigt for mig at oprette en rækkefølge i Tabel1 når jeg indsætter et nyt record. Den skal nemlig komme det rigtig sted.

Håber der er nogen der kan hjælpe mig muligvis fortælle mig hvordan jeg kan løse problemet.
Avatar billede zedios Nybegynder
22. januar 2004 - 10:18 #1
En mulighed er at disable constraints til alle tabeller som referere table1, foretage opdateringen på tabel1 og derefter re-enable constraints.
(Sidst nævnte ville jeg gøre med with check for at sikre at alting er i orden efter opdateringen)
Alternativt kan du afvikle DBCC CHECKCONSTRAINT efter opdateringen for at sikre at integriteten er i orden ..
Avatar billede zedios Nybegynder
22. januar 2004 - 10:19 #2
Du kan gøre dette fra SQL Enterprise Manager eller via T-SQL
Avatar billede donnib Nybegynder
22. januar 2004 - 10:28 #3
Hmm tror ikke helt jeg er med og jeg er ikke sikker på om det kan blive en løsning.

Min Table1 ser således ud :

CREATE TABLE Table1
(
    ResourceID      integer PRIMARY KEY IDENTITY(1,1),
    ApplicationID  integer FOREIGN KEY (ApplicationID) REFERENCES Applications ApplicationID),
    ResourceName    varchar(255),
    TypeID          integer FOREIGN KEY (TypeID) REFERENCES Type(TypeID),
    Used        integer DEFAULT (1),
    Created        datetime default getdate(),
    Modified        datetime
)

som du kan se så har jeg selvfølgeligt en primærnøgle. Hvis jeg nu skal indsætte en ny record som måske skal være mellem 44 og 45 så vil det rykke alle de andre en tal ned derfor skal referencerne til de andre tabeller være korrekte ellers laver den ged i det ik ?
Avatar billede donnib Nybegynder
22. januar 2004 - 10:36 #4
kunne man lave muligvis noget cascade update på primary key til de andre tabeller så man får opdateret det hele rigtigt selvom primarykey id er ændret ? Jeg tror det er langt ude.
Avatar billede ldanielsen Nybegynder
22. januar 2004 - 10:50 #5
Rækkefølge? Kan du ikke lave et nyt integerfelt, SortOrder, som du bruger til at afgøre rækkefølgen. Det behøver vel ikke være ResourceID du bruger
Avatar billede trer Nybegynder
22. januar 2004 - 10:52 #6
donnib> Er det her noget du har tænkt dig som en engangs-forteelse - eller er det noget du regner med skal ske løbende?
Avatar billede ldanielsen Nybegynder
22. januar 2004 - 10:54 #7
Så skal du bare sørge for at sætte den rigtigt når du insert'er:

Indsætte til sidst:
INSERT INTO Table1 (Sortorder) VALUES ((SELECT MAX(SortOrder) + 1 FROM Table1))

indsætte på en 3. plads:
UPDATE Table1 SET Sortorder = Sortorder + 1 WHERE SortOrder >= 3
INSERT INTO Table1 (Sortorder) VALUES (3)
Avatar billede donnib Nybegynder
22. januar 2004 - 10:58 #8
i starten ser alt fint ud men senere i forløbet vil der blivet adderet flere ting til Tabel1. Egentligt så har jeg ikke lavet Tabel2 men bare en tanke om det. Tabel1 er lavet og fungerer men jeg har bare det problem når jeg henter data at de skal være i den rækkefølge som jeg sætter dem ind. Når jeg kun sætter en record i Tabel1 vil den selfølgeligt får et nyt ID og stå nederst og dermed være sidst i listen når jeg SELECTER på tabellen. Der er derfor vigtigt at når jeg skal indsætte et nyt record så skal jeg genoprette hele listen igen så den nye record kommer den rigtige sted og ikke til sidst. Håber det gav en bedre forståelse.
Avatar billede donnib Nybegynder
22. januar 2004 - 10:59 #9
Hmm det lyder som en mulighed men jeg skal lige tænke over det og se om der er nogle huller i det. Der skal så også laves en slags sletning og UPDATE på SortOrder hvis der bliver slettet en record midt i det hele ik ?

Mihai
Avatar billede ldanielsen Nybegynder
22. januar 2004 - 11:15 #10
Jo, du vil fx slette den med ResourceID = 89
UPDATE Table1 SET Sortorder = Sortorder - 1 WHERE SortOrder > (SELECT SortOrder FROM Table1 WHERE ResourceID = 89)

DELETE FROM Table1 WHERE ResourceID = 89

Men er det vigtigt at der ikke er "huller" i talrækken?
Avatar billede donnib Nybegynder
22. januar 2004 - 11:24 #11
okey så er jeg med. Jeg tror dette er løsningen.

Jeg kan dog ikke få lov at gøre følgende :

INSERT INTO Resource (ResourceName,TypeID,ApplicationID, SortOrder) VALUES ('Task.PrepareSetup',1,1,(SELECT MAX(SortOrder) + 1 FROM Resource))

Den kan ikke lide at jeg har et subquery. Kan man gøre det på en anden måde ? sidespørgsmål.

Du får dine point. tak
Avatar billede ldanielsen Nybegynder
22. januar 2004 - 12:04 #12
INSERT INTO Resource (ResourceName,TypeID,ApplicationID, SortOrder)
SELECT 'Task.PrepareSetup', 1, 1, MAX(SortOrder) + 1 FROM Test

Vil virke
Avatar billede donnib Nybegynder
22. januar 2004 - 12:20 #13
Jo tak det fungerede men det er en fejl i den kode som beregner SortOrder:

SELECT MAX(SortOrder) + 1 FROM Resource

Den returnerer NULL hele tiden.

Mihai
Avatar billede donnib Nybegynder
22. januar 2004 - 12:23 #14
Der skal et eller andet logik så den første gang der bliver kørt at den kan finde ud af at sætte 1 ellers vil den jo altid returnere NULL.

Mihai
Avatar billede ldanielsen Nybegynder
22. januar 2004 - 13:15 #15
SELECT ISNULL(MAX(SortOrder) + 1, 0) FROM Resource
Avatar billede donnib Nybegynder
22. januar 2004 - 13:18 #16
så vil jeg ikke forstyrre mere. TAK endnu engang.
Avatar billede ldanielsen Nybegynder
22. januar 2004 - 13:27 #17
Du er da velkommen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester