Mamy tabelę o pojemności 5 GB (prawie 500 milionów wierszy) i chcemy usunąć właściwość identity z jednej z kolumn, ale kiedy próbujemy to zrobić przez SSMS - to mija.
Czy można to zrobić za pomocą T-SQL?
sql
sql-server
tsql
Conrad Jagger
źródło
źródło
Odpowiedzi:
Nie można usunąć
IDENTITY
raz ustawionej specyfikacji.Aby usunąć całą kolumnę:
Informacje o ALTER TABLE tutaj
Jeśli chcesz zachować dane, ale usunąć
IDENTITY
kolumnę, będziesz musiał:IDENTITY
kolumny do nowej kolumnyIDENTITY
kolumnę.źródło
identity
kolumna jest używana jako część aforeign key
w innej tabeli, będziesz musiał najpierw usunąć ograniczenia, a następnie podjąć działania, o których @AdamWenger wspomniał o usuwaniu tożsamości.attribute/property
Możesz również zajrzeć do tego linku, aby uzyskać więcej informacji o usunięciu samego atrybutu: blog.sqlauthority.com/2009/05/03/… ..Powodzenia!Jeśli chcesz to zrobić bez dodawania i wypełniania nowej kolumny , bez zmiany kolejności kolumn i prawie bez przestojów, ponieważ żadne dane nie zmieniają się w tabeli, zróbmy trochę magii z funkcją partycjonowania (ale ponieważ żadne partycje nie są używane, nie t potrzebujesz wersji Enterprise):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
aby zmienić nazwy różnych obiektów schematu z powrotem na oryginalne nazwy, a następnie możesz odtworzyć klucze obce.Na przykład, biorąc pod uwagę:
Możesz wykonać następujące czynności:
źródło
To staje się kłopotliwe z ograniczeniami klucza obcego i podstawowego, więc oto kilka skryptów, które pomogą Ci w drodze:
Najpierw utwórz zduplikowaną kolumnę z tymczasową nazwą:
Następnie uzyskaj nazwę ograniczenia klucza podstawowego:
Teraz spróbuj usunąć ograniczenie klucza podstawowego dla swojej kolumny:
Jeśli masz klucze obce, to się nie powiedzie, więc jeśli tak, porzuć ograniczenia klucza obcego. ŚLEDŹ, KTÓRE TABELE URUCHOMISZ, ABY PÓŹNIEJ DODAĆ OGRANICZENIA !!!
Po usunięciu wszystkich ograniczeń klucza obcego będziesz mógł usunąć ograniczenie PK, upuścić tę kolumnę, zmienić nazwę kolumny tymczasowej i dodać ograniczenie PK do tej kolumny:
Na koniec dodaj ograniczenia FK z powrotem w:
El Fin!
źródło
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
Po prostu miałem ten sam problem. 4 instrukcje w SSMS zamiast używania GUI i było to bardzo szybkie.
Utwórz nową kolumnę
alter table users add newusernum int;
Skopiuj wartości
update users set newusernum=usernum;
Upuść starą kolumnę
alter table users drop column usernum;
Zmień nazwę nowej kolumny na starą nazwę kolumny
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
źródło
Poniższy skrypt usuwa pole Identity dla kolumny o nazwie „Id”
Mam nadzieję, że to pomoże.
źródło
Poniżej kod działa dobrze, gdy nie znamy nazwy kolumny tożsamości .
Musisz skopiować dane do nowej tabeli tymczasowej, takiej jak
Invoice_DELETED
. i następnym razem użyjemy:Więcej informacji można znaleźć pod adresem : https://dba.stackexchange.com/a/138345/101038
źródło
Jednak powyższy kod działa tylko wtedy, gdy nie ma relacji klucza podstawowego-obcego
źródło
Tylko dla kogoś, kto ma ten sam problem, co ja. Jeśli chcesz tylko raz zrobić wstawkę, możesz zrobić coś takiego.
Załóżmy, że masz tabelę z dwiema kolumnami
i chcesz wstawić wiersz o numerze ID = 4. Więc zmieniasz go na 3, więc następny to 4
Zrób wstawkę
I wróć do najwyższego ID, przypuśćmy, że jest to 15
Gotowe!
źródło
Miałem te same wymagania i możesz spróbować w ten sposób, co osobiście ci polecam, proszę ręcznie zaprojektować swoją tabelę i wygenerować skrypt, a to, co poniżej zrobiłem, to zmiana nazwy starej tabeli, a także jej ograniczenie do tworzenia kopii zapasowych.
źródło
W SQL Server możesz włączać i wyłączać wstawianie tożsamości w następujący sposób:
USTAW IDENTITY_INSERT nazwa_tabeli ON
- uruchom tutaj swoje zapytania
WYŁĄCZ IDENTITY_INSERT nazwa_tabeli
źródło