Modifies a table definition.
Syntax 1
ALTER TABLE [ owner.]table-name |{ ENABLE | DISABLE } RLV STORE { alter-clause, ... }
Syntax 2
ALTER TABLE table_name ALTER OWNER TO new_owner [ { PRESERVE | DROP } PERMISSIONS ] [ { PRESERVE | DROP } FOREIGN KEYS ]
ADD create-clause | ALTER column-name column-alteration | ALTER [ CONSTRAINT constraint-name ] CHECK ( condition ) | DROP drop-object | RENAME rename-object | move-clause | SPLIT PARTITION range-partition-name INTO( range-partition-decl-1, range-partition-decl-2 | SPLIT SUBPARTITION range-subpartition-name INTO ( subrange-partition-decl-1, subrange-partition-decl-2 ) | MERGE PARTITION partition-name-1 INTO partition-name-2 | MERGE SUBPARTITION subrange-partition-name-1 INTO subrange-partition-name-2 | UNPARTITION | PARTITION BY range-partitioning-scheme | hash-partitioning-scheme | composite-partitioning-scheme
column-name column-definition [ column-constraint ] | table-constraint | [ PARTITION BY | SUBPARTITION BY ] range-partitioning-scheme
column-name data-type [ NOT NULL | NULL ] [ IN dbspace-name ] [ DEFAULT default-value | IDENTITY ]
[ CONSTRAINT constraint-name ] { UNIQUE | PRIMARY KEY | REFERENCES table-name [ (column-name ) ] [ actions ] | CHECK ( condition ) | IQ UNIQUE ( integer ) }
[ CONSTRAINT constraint-name ] { UNIQUE ( column-name [ , … ] ) | PRIMARY KEY ( column-name [ , … ] ) | foreign-key-constraint | CHECK ( condition ) }
FOREIGN KEY [ role-name ] [ ( column-name [ , … ] ) ] ... REFERENCES table-name [ ( column-name [ , … ] ) ] ... [ actions ]
[ ON { UPDATE | DELETE } { RESTRICT } ]
{ column-data-type | alterable-column-attribute } [ alterable-column-attribute … ] | ADD [ constraint-name ] CHECK ( condition ) | DROP { DEFAULT | CHECK | CONSTRAINT constraint-name }
[ NOT ] NULL | DEFAULT default-value | [ CONSTRAINT constraint-name ] CHECK { NULL |( condition ) }
CURRENT { DATABASE |DATE |REMOTE USER |TIME |TIMESTAMP | USER |PUBLISHER ) | string | global variable | [ - ] number | ( constant-expression ) | built-in-function ( constant-expression ) | AUTOINCREMENT | NULL | TIMESTAMP | LAST USER | USER
{ column-name | CHECK constraint-name | CONSTRAINT | UNIQUE ( index-columns-list ) | PRIMARY KEY | FOREIGN KEY fkey-name | [ PARTITION | SUBPARTITION ] range-partition-name }
new-table-name | column-name TO new-column-name | CONSTRAINT constraint-name TO new-constraint-name | [ PARTITION | SUBPARTITION ] range-partition-name TO new-range-partition-name
{ ALTER column-name MOVE { PARTITION ( range-partition-name TO new-dbspace-name) | SUBPARTITION ( range-partition-name TO new-dbspace-name | TO new-dbspace-name } } | MOVE PARTITION range-partition-name TO new-dbspace-name | MOVE SUBPARTITION range-partition-name TO new-dbspace-name | MOVE TO new-dbspace-name | MOVE METADATA TO new-dbspace-name }
RANGE( partition-key ) ( range-partition-decl [,range-partition-decl ...] )
HASH ( partition-key [, partition-key,…] )
hash-partitioning scheme SUBPARTITION range-partitioning-scheme
column-name
range-partition-name VALUES <= ( {constant | MAX } ) [ IN dbspace-name ]
ALTER TABLE Employees ADD office CHAR(20)
ALTER TABLE Employees DROP office
ALTER TABLE Customers ADD SalesContact INTEGER REFERENCES Employees (EmployeeID)
ALTER TABLE Customers ADD CustomerNum INTEGER DEFAULT 88
CREATE TABLE foo ( c1 INT IN Dsp1, c2 VARCHAR(20), c3 CLOB IN Dsp2, c4 DATE, c5 BIGINT, PRIMARY KEY (c5) IN Dsp4) IN Dsp3); CREATE DATE INDEX c4_date ON foo(c4) IN Dsp5; ALTER TABLE foo MOVE TO Dsp6;
ALTER TABLE foo ALTER c1 MOVE TO Dsp7
Create a partitioned table:
CREATE TABLE bar ( c1 INT, c2 DATE, c3 VARCHAR(10)) PARTITION BY RANGE(c2) (p1 VALUES <= ('2005-12-31') IN dbsp1, p2 VALUES <= ('2006-12-31') IN dbsp2, P3 VALUES <= ('2007-12-31') IN dbsp3, P4 VALUES <= ('2008-12-31') IN dbsp4); INSERT INTO bar VALUES(3, '2007-01-01', 'banana nut'); INSERT INTO BAR VALUES(4, '2007-09-09', 'grape jam'); INSERT INTO BAR VALUES(5, '2008-05-05', 'apple cake');
Move partition p2 to dbsp5:
ALTER TABLE bar MOVE PARTITION p2 TO DBSP5;
Split partition p4 into 2 partitions:
ALTER TABLE bar SPLIT PARTITION p4 INTO (P41 VALUES <= ('2008-06-30') IN dbsp4, P42 VALUES <= ('2008-12-31') IN dbsp4);
This SPLIT PARTITION reports an error, as it requires data movement. Not all existing rows are in the same partition after split.
ALTER TABLE bar SPLIT PARTITION p3 INTO (P31 VALUES <= ('2007-06-30') IN dbsp3, P32 VALUES <= ('2007-12-31') IN dbsp3);
This error is reported:
No data move is allowed, cannot split partition p3.
This SPLIT PARTITION reports an error, because it changes the partition boundary value:
ALTER TABLE bar SPLIT PARTITION p2 INTO (p21 VALUES <= ('2006-06-30') IN dbsp2, P22 VALUES <= ('2006-12-01') IN dbsp2);
This error is reported:
Boundary value for the partition p2 cannot be changed.
Merge partition p3 into p2. An error is reported as a merge from a higher boundary value partition into a lower boundary value partition is not allowed.
ALTER TABLE bar MERGE PARTITION p3 into p2;
This error is reported:
Partition 'p2' is not adjacent to or before partition 'p3'.
Merge partition p2 into p3:
ALTER TABLE bar MERGE PARTITION p2 INTO P3;
Rename partition p1 to p1_new:
ALTER TABLE bar RENAME PARTITION p1 TO p1_new;
Unpartition table bar:
ALTER TABLE bar UNPARTITION;
Partition table bar. This command reports an error, because all rows must be in the first partition.
ALTER TABLE bar PARTITION BY RANGE(c2) (p1 VALUES <= ('2005-12-31') IN dbsp1, P2 VALUES <= ('2006-12-31') IN DBSP2, P3 VALUES <= ('2007-12-31') IN dbsp3, P4 VALUES <= ('2008-12-31') IN dbsp4);
This error is reported:
All rows must be in the first partition.
Partition table bar:
ALTER TABLE bar PARTITION BY RANGE(c2) (p1 VALUES <= ('2008-12-31') IN dbsp1, P2 VALUES <= ('2009-12-31') IN dbsp2, P3 VALUES <= ('2010-12-31') IN dbsp3, P4 VALUES <= ('2011-12-31') IN dbsp4);
ALTER TABLE tab1 DISABLE RLV STORE
The ALTER TABLE statement changes table attributes (column definitions and constraints) in a table that was previously created. The syntax allows a list of alter clauses; however, only one table constraint or column constraint can be added, modified, or deleted in each ALTER TABLE statement. ALTER TABLE is prevented whenever the statement affects a table that is currently being used by another connection. ALTER TABLE can be time consuming, and the server does not process requests referencing the same table while the statement is being processed.
SAP Sybase IQ enforces REFERENCES and CHECK constraints. Table and/or column check constraints added in an ALTER TABLE statement are evaluated, only if they are defined on one of the new columns added, as part of that alter table operation. For details about CHECK constraints, see CREATE TABLE Statement.
If SELECT * is used in a view definition and you alter a table referenced by the SELECT *, then you must run ALTER VIEW <viewname> RECOMPILE to ensure that the view definition is correct and to prevent unexpected results when querying the view.
The table must be empty to specify NOT NULL. The table might contain data when you add an IDENTITY or DEFAULT AUTOINCREMENT column. If the column has a default IDENTITY value, all rows of the new column are populated with sequential values. You can also add FOREIGN constraint as a column constraint for a single column key. The value of the IDENTITY/DEFAULT AUTOINCREMENT column uniquely identifies every row in a table.
The IDENTITY/DEFAULT AUTOINCREMENT column stores sequential numbers that are automatically generated during inserts and updates. DEFAULT AUTOINCREMENT columns are also known as IDENTITY columns. When using IDENTITY/DEFAULT AUTOINCREMENT, the column must be one of the integer data types, or an exact numeric type, with scale 0. See CREATE TABLE Statement for more about column constraints and IDENTITY/DEFAULT AUTOINCREMENT columns.
FP_NBIT_AUTOSIZE_LIMIT limits the number of distinct values that load as NBit
FP_NBIT_LOOKUP_MB sets a threshold for the total NBit dictionary size
FP_NBIT_ROLLOVER_MAX_MB sets the dictionary size for implicit NBit rollovers from NBit to Flat FP
FP_NBIT_ENFORCE_LIMITS enforces NBit dictionary sizing limits. This option is OFF by default
Consider memory usage when specifying high IQ UNIQUE values. If machine resources are limited, avoid loads with FP_NBIT_ENFORCE_LIMITS='OFF' (default).
Prior to SAP Sybase IQ 16.0, an IQ UNIQUE n value > 16777216 would rollover to Flat FP. In 16.0, larger IQ UNIQUE values are supported for tokenization, but may require significant memory resource requirements depending on cardinality and column width.
BIT, BLOB,and CLOB data types do not support NBit dictionary compression. If FP_NBIT_IQ15_COMPATIBILITY=’OFF’, a non-zero IQ UNIQUE column specification in a CREATE TABLE or ALTER TABLE statement that includes these data types returns an error.
SET DEFAULT default-value — Change the default value of an existing column in a table. You can also use the MODIFY clause for this task, but ALTER is ISO/ANSI SQL compliant, and MODIFY is not. Modifying a default value does not change any existing values in the table.
DROP DEFAULT — Remove the default value of an existing column in a table. You can also use the MODIFY clause for this task, but ALTER is ISO/ANSI SQL compliant, and MODIFY is not. Dropping a default does not change any existing values in the table.
ADD — Add a named constraint or a CHECK condition to the column. The new constraint or condition applies only to operations on the table after its definition. The existing values in the table are not validated to confirm that they satisfy the new constraint or condition.
CONSTRAINT column-constraint-name — The optional column constraint name lets you modify or drop individual constraints at a later time, rather than having to modify the entire column constraint.
[ CONSTRAINT constraint-name ] CHECK ( condition ) — Use this clause to add a CHECK constraint on the column.
SET COMPUTE (expression) — Change the expression associated with a computed column. The values in the column are recalculated when the statement is executed, and the statement fails if the new expression is invalid.
DROP COMPUTE — Change a column from being a computed column to being a non-computed column. This statement does not change any existing values in the table.
ADD table-constraint — Add a constraint to the table.
You can also add a foreign key constraint as a table constraint for a single-column or multicolumn key. If PRIMARY KEY is specified, the table must not already have a primary key created by the CREATE TABLE statement or another ALTER TABLE statement. See CREATE TABLE Statement for a full explanation of table constraints.
DROP column-name — Drop the column from the table. If the column is contained in any multicolumn index, uniqueness constraint, foreign key, or primary key, then the index, constraint, or key must be deleted before the column can be deleted. This does not delete CHECK constraints that refer to the column. An IDENTITY/DEFAULT AUTOINCREMENT column can only be deleted if IDENTITY_INSERT is turned off and the table is not a local temporary table.
DROP CHECK — Drop all check constraints for the table. This includes both table check constraints and column check constraints.
DROP CONSTRAINT constraint-name — Drop the named constraint for the table or specified column.
DROP UNIQUE ( column-name, ... ) — Drop the unique constraints on the specified column(s). Any foreign keys referencing the unique constraint (rather than the primary key) are also deleted. Reports an error if there are associated foreign-key constraints. Use ALTER TABLE to delete all foreign keys that reference the primary key before you delete the primary key constraint.
DROP PRIMARY KEY — Drop the primary key. All foreign keys referencing the primary key for this table are also deleted. Reports an error if there are associated foreign key constraints. If the primary key is unenforced, DELETE returns an error if associated unenforced foreign key constraints exist.
DROP FOREIGN KEY role-name — Drop the foreign key constraint for this table with the given role name. Retains the implicitly created non-unique HG index for the foreign key constraint. Users can explicitly remove the HG index with the DROP INDEX statement.
CREATE TABLE foo (c1 INT, c2 INT) PARTITION BY RANGE (c1) (P1 VALUES <= (100) IN dbsp1, P2 VALUES <= (200) IN dbsp2, P3 VALUES <= (MAX) IN dbsp3 ) IN dbsp4); LOAD TABLE …. ALTER TABLE DROP PARTITION P1;Use DROP SUBPARTITIONfor tables partitioned by a composite-partitioning-scheme.
RENAME new-table-name — Change the name of the table to the new-table-name. Any applications using the old table name must be modified. Also, any foreign keys that were automatically assigned the same name as the old table name do not change names.
RENAME column-name TO new-column-name — Change the name of the column to new-column-name. Any applications using the old column name must be modified.
RENAME [ PARTITION | SUBPARTITION ] — Rename an existing partition or sub-partition.
RENAME constraint-name TO new-constraint-name — Change the name of the constraint to new-constraint-name. Any applications using the old constraint name must be modified.
MOVE clause — Moves a table object.
MOVE TO — Move all table objects including columns, indexes, unique constraints, primary key, foreign keys, and metadata resided in the same dbspace as the table is mapped to the new dbspace. The ALTER Column MOVE TO clause cannot be requested on a partitioned table.
MOVE TABLE METADATA — Move the metadata of the table to a new dbspace. For a partitioned table, MOVE TABLE METADATA also moves metadata that is shared among partitions.
MOVE PARTITION — Move the specified partition to the new dbspace.
MOVE SUBPARTITION — Move the specified range subpartition of an existing hash-range partitioned table to the new dbspace.
PARTITION BY — Partitions a non-partitioned table. A non-partitioned table can be partitioned, if all existing rows belong to the first partition. You can specify a different dbspace for the first partition than the dbspace of the column or table. But existing rows are not moved. Instead, the proper dbspace for the column/partition is kept in SYS.ISYSIQPARTITIONCOLUMN for existing columns. Only the default or max identity column(s) that are added later for the first partition are stored in the specified dbspace for the first partition.
PARTITION BY RANGE — Maps data to partitions based on a range of partition keys established for each partition.
PARTITION BY HASH — Maps data to partitions based on partition key values processed by a system-defined function. An existing table with rows can only be made hash-range partitioned if all the hash partition keys hash to a single subpartition; in practice, this means only empty tables can always be altered.
PARTITION BY composite-partitioning-scheme — Subpartition rows after partitioning by RANGE or HASH. This method provides the benefits of combined partitioning methods.
SUBPARTITION BY RANGE — Adds a new range subpartition to an existing hash-range partitioned table. The new range subpartition will be logically partitioned by hash with the same hash partitioned keys as the existing hash-range partitioned table.
DROP SUBPARTITION — Delete rows and drops the sub-partition definition from an existing hash-range partitioned table. The specified range subpartition is dropped
MOVE PARTITION — Moves the specified range subpartition of an existing hash-range partitioned table to the new dbspace.
MOVE SUBPARTITION — Moves the column of the specified hash-range partition to the specified dbspace.
SPLIT PARTITION — Splits the specified range subpartition of a hash-range partitioned table into two partitions. Split the specified partition into two partitions. A partition can be split only if no data must be moved. All existing rows of the partition to be split must remain in a single partition after the split. merges range-subpartition-name-1 into range-subpartition-name-2 of a hash-range partitioned table.
The boundary value for partition-decl-1 must be less than the boundary value of partition-name and the boundary value for partition-decl-2 must be equal to the boundary value of partition-name. You can specify different names for the two new partitions. The old partition-name can only be used for the second partition, if a new name is not specified.
SPLIT SUBPARTITION — Splits the specified range subpartition of a hash-range partitioned table into two partitions.
MERGE PARTITION — Merge partition-name-1 into partition-name-2. Two partitions can be merged if they are adjacent partitions and the data resides on the same dbspace. You can only merge a partition with a lower partition value into the adjacent partition with a higher partition value. Note that the server does not check CREATE permission on the dbspace into which the partition is merged. For an example of how to create adjacent partitions, see CREATE TABLE Statement examples.
RENAME [ PARTITION | SUBPARTITION ] — Rename an existing PARTITION or SUBPARTITION.
UNPARTITION — Remove partitions from a partitioned table. Each column is placed in a single dbspace. Note that the server does not check CREATE permission on the dbspace to which data of all partitions is moved. ALTER TABLE UNPARTITION blocks all database activities.
ALTER OWNER – Change the owner of a table. The ALTER OWNER clause may not be used in conjunction with any other [alter-clause] clauses of the ALTER TABLE statement.
[ PRESERVE | DROP ] PERMISSIONS – If you do not want the new owner to have the same privileges as the old owner, use the DROP permissions clause (default) to drop all explicitly-granted privileges that allow a user access to the table. Implicitly-granted privileges given to the owner of the table are given to the new owner and dropped from the old owner.
[ PRESERVE | DROP ] FOREIGN KEYS If you want to prevent the new owner from accessing data in referenced tables, use the DROP FOREIGN KEYS clause (default) to drop all foreign keys within the table, as well as all foreign keys referring to the table. Use of the PRESERVE FOREIGN KEYS clause with the DROP PERMISSIONS clause fails unless all referencing tables are owned by the new owner.
Automatic commit. The ALTER and DROP options close all cursors for the current connection. The Interactive SQL data window is also cleared.
A checkpoint is carried out at the beginning of the ALTER TABLE operation.
Once you alter a column or table, any stored procedures, views or other items that refer to the altered column no longer work.
SQL—Vendor extension to ISO/ANSI SQL grammar.
Sybase—Some clauses are supported by Adaptive Server Enterprise.
Syntax 1
The system privileges required for syntax 1 varies depending upon the clause used.
Clause | Privilege Required |
---|---|
Add | Requires one of:
UNIQUE, PRIMARY KEY, FOREIGN KEY, or IQ UNIQUE column constraint – Requires above along with REFERENCE privilege on the underlying table. FOREIGN KEY
table constraint requires above along with one of:
Hash partition, range partition, or hash-range partition requires above
along with one of:
|
Alter | Requires one of:
To alter a primary key or unique constraint, also requires REFERENCE permission on the table. |
Drop | Drop a column with no constraints – Requires one of:
Drop a column or table with a constraint requires above along with REFERENCE permission if using ALTER permission. Drop a partition on table owned by self – None required. Drop a partition on table owned by other users
– Requires one of:
|
RENAME | Requires one of:
|
Move | Requires one of:
|
Split Partition or Subpartition | Partition on table owned by self – None required. Partition on table owned
by other users – Requires one of:
|
Merge Partition or Subpartition Unpartition |
Table owned by self – None required. Table owned by other users – Requires
one of:
|
Partition By | Hash partition, range partition, or hash-range partition – Requires one of:
|
Enable or disable RLV store | Requires one of:
|
Syntax 2