2012-03-30 7 views
0

Ich habe eindeutige Zeilen mit Primärschlüssel in meiner emp Tabelle.Aktualisieren oder Einfügen von Problemen in SQL Server?

select * from EMP E; 

Jetzt habe ich emp_backup Tabelle erstellt, die wie Sicherung von emp Tabelle nimmt.

insert into emp_backup 
select * from emp e 
where not exists (select EMPNO from emp_backup E1 where E1.EMPNO=e.EMPNO); 

die obige Abfrage erfolgreich kopiert alle Zeilen emp-emp_backup und es ist sicher, wenn Sie wieder über Abfrage ausgeführt wird, die bestehenden Reihen emp-emp_backup Tabelle in nächsten Lauf nicht kopieren.

jetzt ist mein Problem, wenn ich einen Datensatz in emp Tabelle aktualisieren und versuchen, über Abfrage ausführen gibt es mir Fehler primary key violation, die ausgenommen ist.

zum Beispiel.

update EMP 
set JOB='worker' 
where EMPNO=14; 

I emp Tabelle aktualisieren, nachdem mit empno 14 den Datensatz zu kopieren Tabelle zu emp_backup.

Wenn ich insert into emp_backup.... Abfrage ausführen Ich möchte diese Update-Änderung sollte in emp_backup Tabelle widerspiegeln.

Wie kann ich die obige Abfrage so ändern, dass die aktualisierten Zeilen mit dem vorhandenen Primärschlüssel von emp nach kopiert werden.

Ich hoffe, meine Frage ist klar, sag mir, wie ich es verbessern kann.

+0

definiert haben Sie eine andere Spalte als eindeutige Schlüssel oder Primärschlüssel in emp_backup –

+0

@SathyaNarayanan Ich habe nur 'empno' als Primärschlüssel in beide' emp' und 'emp_backup' Tisch . –

+1

Warum verwenden Sie kein Backup? Sie könnten sowohl Voll als auch Differential für Optionen verwenden ... –

Antwort

0

Es scheint, dass, wenn Sie Ihre emp_backup Tabelle erstellt, dass Sie auch eine Tabelle PK auf der ANGNR Tabelle erstellt. Dies verhindert, dass Sie den gleichen Emp-Eintrag zweimal einfügen können.

Sie benötigen eine ‚Backup‘ Plan zu überdenken - tun Sie

  1. eine laufende Prüfung jeder Version jedes Datensatzes Änderung in der Tabelle emp genau
  2. ein Spiegel der Tabelle emp wollen?

Für 1:

  • Löschen Sie die Primärschlüssel auf emp_backup Tisch. Dadurch können doppelte EMP-Datensätze darin kopiert werden. Wenn Sie Idempotenz für die Tabelle emp_backup benötigen, können Sie eine neue Ersatz-PK (z.emp_backup_id int identity(1,1) und möglicherweise eine neue CURRENT_TIMESTAMP notleidenden Spalte, die Sie bei der Bestimmung zu helfen, welche die neuesten

Nach dem Fallenlassen Ihre PK, kann aktualisierten Datensätze als ‚gesichert‘ werden:

insert into emp_backup 
select * from emp e 
where exists 
    (select EMPNO 
    from emp_backup E1 
    where E1.EMPNO=e.EMPNO 
    and 
    (e1.othercolumn1 <> e.othercolumn1 
    or e1.othercolumn2 <> e.othercolumn2 
    ... 
    ) 
); . 

(Beachten Sie, dass Spalten bestimmte Arten können nicht direkt miteinander verglichen werden)

für 2, Sie müßten bestehende Datensätze in Ihrer emp_bak Tabelle aktualisieren:

update eb 
set eb.othercolumn1 = e.othercolumn1, 
    eb.othercolumn2 = e.othercolumn2 
from emp_backup eb 
    inner join emp e on eb.empno = e.empno 
where 
    eb.othercolumn1 <> e.othercolumn1 
    or eb.othercolumn2 <> e.othercolumn2 
    ... 
); . 

Aber Tisch Spiegelung wirft die Frage auf, jedes Mal wenn Sie eine Sicherungskopie, warum Ihre vorhandene emp_backup Tabelle nicht nur fallen lassen und zu tun:

insert into emp_backup 
select * from emp e 

??

+0

Ich kann keine Backup-Tabelle löschen, die jedes Mal mehr als Millionen Datensätze enthält. –

+0

Verwenden Sie in diesem Fall einen Trigger, um zu prüfen, wie @Karl dies vorschlägt, oder vertrauen Sie Ihre Daten einfach nur Backups an, wie OMGPonies kommentierte. – StuartLC

1

Um alle Änderungen zu sammeln, benötigen Sie eine Protokoll- (oder Audit-) Tabelle. Erstellen Sie einen triger auf Ihrem Tisch, der einen Datensatz schreibt, indem Sie bei jeder Änderung ein Protokoll in das Feld activity-time aufnehmen. Wählen Sie dann aus der Protokolltabelle aus, wenn das Aktivitätszeitfeld größer als die letzte Sicherungsabfrage ist.

thizs ermöglicht es Sie, alle Update Einsatz zu sammeln und löscht

0

Da Sie SQL Server 2008 verwenden, können Sie den Befehl MERGE verwenden.

Mit diesem Befehl können Sie Datensätze hinzufügen, wenn sie nicht in Ihrer Sicherungstabelle vorhanden sind, und sie aktualisieren, damit sie übereinstimmen, wenn sie vorhanden sind.

Here's an example from MSDN:

MERGE emp_backup AS T 
USING emp AS S 
ON (T.EMPNO = S.EMPNO) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(EMPNO, JOB) VALUES(S.EMPNO, S.JOB) 
WHEN MATCHED 
    THEN UPDATE SET T.JOB = S.JOB 
Verwandte Themen