2013-04-13 19 views
16

Próbowałem następujących ale mam błąd składniJak dodać i Kolumny w jednej tabeli ALTER

ALTER TABLE Grades ( 
DROP COLUMN (Student_FamilyName, Student_Name), 
ADD Student_id INT); 

to możliwe, aby wykonać DROP i ADD w tym samym ALTER TABLE stwierdzeniem?

+3

nie można zrobić kroplę i stworzyć jedną aLTER, oddziel je –

+1

przełączyć do PostgreSQL (kaszel), który wspiera wiele [zmiany] (http: //www.postgresql. lub g/docs/currrent/static/sql-altertable.html) jako rozszerzenie standardowej składni SQL. (Chociaż często korzystam z PostgreSQL, zazwyczaj * piszę SQL, który unika rozszerzeń.) –

+0

Którego DBMS używasz? Wyrocznia? DB2? –

Odpowiedz

19

Jeśli spojrzeć na ALTER TABLE SYTAX

zobaczysz ten

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
    ALTER COLUMN column_name 
    { 
     [ type_schema_name. ] type_name [ ({ precision [ , scale ] 
      | max | xml_schema_collection }) ] 
     [ COLLATE collation_name ] 
     [ NULL | NOT NULL ] [ SPARSE ] 

    | {ADD | DROP } 
     { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE } 
    } 
     | [ WITH { CHECK | NOCHECK } ] 

    | ADD 
    { 
     <column_definition> 
     | <computed_column_definition> 
     | <table_constraint> 
     | <column_set_definition> 
    } [ ,...n ] 

    | DROP 
    { 
     [ CONSTRAINT ] 
     { 
       constraint_name 
       [ WITH 
       (<drop_clustered_constraint_option> [ ,...n ]) 
       ] 
      } [ ,...n ] 
      | COLUMN 
      { 
       column_name 
      } [ ,...n ] 
    } [ ,...n ] 

ta może być zmniejszona do

ALTER TABLE { ALTER COLUMN column_name | ADD | DROP }

Według Transact-SQL Syntax Conventions (Transact-SQL)| (pionowy pasek)

Oddziela pozycje składni ujęte w nawiasy lub nawiasy klamrowe. Możesz użyć tylko jednego z przedmiotów.

Nie można zmienić, upuścić ani dodać pojedynczego wyciągu. Masz również parens i przecinek, które nie będą działać. Więc trzeba

ALTER TABLE Grades DROP COLUMN (Student_FamilyName, Student_Name); 
ALTER TABLE Grades ADD Student_id INT; 

Jeśli trzeba je za działanie atomowy wystarczy zawinąć w transakcji

+0

"_Jeśli potrzebujesz, aby były one akcją atomową, którą musisz zawinąć w transaction_" - czy Oracle DDL nie powoduje niejawnych zatwierdzeń? – Sepster

+0

Lub jak w T-SQL: ALTER TABLE Klasy DROP COLUMN Student_FamilyName, COLUMN Student_Name; –

1

W przypadku, gdy baza danych jest MySQL, można zrobić to w ten sposób

ALTER TABLE Grades 
DROP COLUMN Student_FamilyName, 
DROP COLUMN Student_Name, 
ADD Student_id INT 

Pracuje w MySQL 5.5.5