CREATE TABLE [ ALLBASE/SQL Reference Manual ] MPE/iX 5.5 Documentation
ALLBASE/SQL Reference Manual
CREATE TABLE
The CREATE TABLE statement defines a table. It also defines the locking
strategy that ALLBASE/SQL uses automatically when the table is accessed
and in some cases automatically issues a GRANT statement. It can also
define the storage structure of the table and restrictions or defaults
placed on values which the table's columns can hold. You can also use
this statement to assign a table to a partition for audit logging
purposes.
Scope
ISQL or Application Programs
SQL Syntax--CREATE TABLE
[PRIVATE ]
CREATE [PUBLICREAD] TABLE [Owner.]TableName
[PUBLIC ]
[PUBLICROW ]
{ColumnDefinition }
[LANG = TableLanguageName] ( {UniqueConstraint } [,...])
{ReferentialConstraint}
{CheckConstraint }
[UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages]
[HASH ON CONSTRAINT [ConstraintID] PAGES = PrimaryPages ]
[CLUSTERING ON CONSTRAINT [ConstraintID] ]
[ {PartitionName}]
[IN PARTITION {DEFAULT }] [IN DBEFileSetName1]
[ {NONE }]
Parameters--CREATE TABLE
PRIVATE enables the table to be used by only one
transaction at a time. This is the most
efficient option for tables that do not need to
be shared because ALLBASE/SQL can spend less time
managing locks.
This option is in effect by default; grants are
not automatically issued.
PUBLICREAD enables the table to be read by concurrent
transactions, but allows no more than one
transaction at a time to update the table.
This option automatically issues a statement
GRANT SELECT ON TableName TO PUBLIC. This gives
any user with CONNECT authority the ability to
read the table. To change this grant, use the
REVOKE statement and the GRANT statement. The
locking strategy remains unchanged, even if you
change the grant.
PUBLIC enables the table to be read and updated by
concurrent transactions. In general, a
transaction locks a page in share mode before
reading it and in exclusive mode before updating
it.
This option automatically issues the statement
GRANT ALL ON TableName TO PUBLIC. This gives any
user with CONNECT authority the ability to read
and modify the table as well as to alter the
table and create indexes on it. To change this
grant, use the REVOKE statement and the GRANT
statement. The locking strategy remains
unchanged, even if you change the grant.
PUBLICROW enables the table to be read and updated by
concurrent transactions. The locking unit is a
row (tuple) in PUBLICROW tables. In general, a
transaction locks a row in share mode before
reading it and in exclusive mode before updating
it. For small tables with small rows,
concurrency can be maximized by using the
PUBLICROW type.
This option automatically issues the statement
GRANT ALL ON TableName TO PUBLIC. This gives any
user with CONNECT authority the ability to read
and modify the table as well as to alter the
table and create indexes on it. To change this
grant, use the REVOKE statement and the GRANT
statement. The locking strategy remains
unchanged, even if you change the grant.
[Owner.]TableName is the name to be assigned to the new table. Two
tables cannot have the same owner name and table
name.
You can specify the owner of the new table if you
have DBA authority. If you do not have DBA
authority, you can specify the owner as the name
of any group to which you belong. If you do not
specify the owner name, your DBEUserID, schema
authorization name, procedure owner, or the ISQL
SET OWNER name becomes the owner of the new
table. For more information, refer to the
section "Default Owner Rules" in the chapter
"Using ALLBASE/SQL."
TableLanguageName specifies the language for the new table. This
name must be either NATIVE-3000 or the language
of the DBEnvironment. The default is the
language of the DBEnvironment.
ColumnDefinition defines an individual column in a table. Each
table must have at least one column. The syntax
for a CREATE TABLE column definition is presented
separately in another section below.
UniqueConstraint defines a uniqueness constraint for the table.
Each table can have multiple unique constraints,
but can have only one specifying PRIMARY KEY. The
syntax for a UniqueConstraint is presented
separately in another section below.
ReferentialConstraint defines a referential constraint of this table
with respect to another (or the same) table. The
referencing table (this one) and the referenced
table (the other one) satisfy the constraint if,
and only if each row in the referencing table
contains either a NULL in a referencing column,
or values in the rows of the referencing columns
equal the values in the rows of the referenced
columns. The syntax of a ReferentialConstraint
is presented separately in another section below.
CheckConstraint defines a check constraint for the table. A
table can have multiple check constraints. The
syntax for a check constraint is presented
separately in another section below.
UNIQUE HASH ON specifies a hash structure for the table. Only
UNIQUE HASH structures may be created, and
updates on hash key columns are not permitted
(you must first delete, then insert the row with
the new key value).
HashColumnName specifies a column defined in the table that is
to participate in the hash key of this table.
PrimaryPages specifies the number of pages used as primary
hash buckets. The minimum is 1 and the maximum
is determined by the formula 16*((231)-2072).
For good results, use a prime number.
HASH ON CONSTRAINT specifies that the named unique constraint be
managed through the use of hash table storage.
The unique constraint's columns become the hash
key columns.
ConstraintID is an optional name specified for the constraint.
If none is supplied, one is generated, as
described under "Description" below.
IN PARTITION specifies what partition the table will be in for
the purposes of audit logging.
PartitionName specifies the partition for the table.
DEFAULT specifies that the default partition of the
database will be used. The number associated
with the default partition is determined at the
time the INSERT, UPDATE, or DELETE is executed on
the table. If the default partition is NONE at
that time, audit logging of the operation is not
done. Any change to the default partition number
occurring in a START DBE NEWLOG statement alters
the partition number that audit logging uses on
tables that are in the default partition.
NONE specifies that this table is assigned to no
partition, and so will have no audit logging done
on it.
CLUSTERING ON specifies that the named unique or referential
CONSTRAINT constraint be managed through a clustered index
structure rather than nonclustered. The unique
constraint's unique column list, or referential
constraint's referencing column list, becomes the
clustered key.
IN DBEFileSetName1 causes the index and data pages in which table
information is stored to be allocated from
DBEFiles associated with the specified
DBEFileSet. (Names of available DBEFileSets are
recorded in the SYSTEM.DBEFILESET view.) If a
DBEFileSet name is not specified, the table is
created in the default TABLESPACE DBEFileSet.
(Refer to syntax for the SET DEFAULT DBEFILESET
statement.)
You can create a nonhash table in an empty
DBEFileSet, but cannot INSERT any rows or create
any indexes for the table until the DBEFileSet
has DBEFiles associated with it.
You cannot create a hash structure in an empty
DBEFileSet.
SQL Syntax--Column Definition
ColumnName {ColumnDataType } [LANG = ColumnLanguageName]
{LongColumnType [IN DBEFileSetName2]}
[ {Constant }]
[[NOT] CASE SENSITIVE] [DEFAULT {USER }]
[ {NULL }]
[ {CurrentFunction}]
[NOT NULL [{UNIQUE } [CONSTRAINT ConstraintID]] ]
[ [{PRIMARY KEY} ] ]
[ ]
[REFERENCES RefTableName [(RefColumnName)] [CONSTRAINT ConstraintID]]
[[...] ]
[ ]
[CHECK (SearchCondition) [CONSTRAINT ConstraintID] ]
[[IN DBEFileSetName3] ]
[...]
Parameters--Column Definition
ColumnName is the name to be assigned to one of the columns
in the new table. No two columns in the table
can be given the same name. You can define a
maximum of 1023 columns in a table.
ColumnDataType indicates what type of data the column can
contain. Some data types require that you
include a length. See the "Data Types" chapter
for the data types that can be specified.
LongColumnType specifies a LONG data type for the new column.
At most 40 columns with a LongColumnType may be
defined in a single table.
DBEFileSetName2 specifies the DBEFileSet where long column data
is to be stored. This DBEFileSet may be
different from that of the table. If a
DBEFileSet is not specified, the LONG data is
stored in the DBEFileSet containing the table.
ColumnLanguageName specifies the language for the column. This can
only be specified for CHAR or VARCHAR columns.
This name must be either NATIVE-3000 or the
language of the DBEnvironment. The default is
the language of the DBEnvironment.
CASE SENSITIVE indicates that upper and lower case letters
stored in the column are not considered
equivalent. If the column is defined as NOT CASE
SENSITIVE, then its upper and lower case letters
are considered equivalent. The default is CASE
SENSITIVE. This clause is allowed only with CHAR
and VARCHAR columns.
DEFAULT specifies the default value to be inserted for
this column.
The default can be a constant, NULL, or a
date/time current function The data type of the
default value must be compatible with the data
type of the column. DEFAULT cannot be specified
for LONG data type columns.
NOT NULL means the column cannot contain null values. If
NOT NULL is specified, any statement that
attempts to place a null value in the column is
rejected. However, if atomicity is set to row
level, only the NULL row receives the error and
the statement halts.
UNIQUE | PRIMARY KEY specifies a unique constraint placed on the
column. The table level constraint { UNIQUE |
PRIMARY KEY } (ColumnName) is equivalent. See
the discussion on table level unique constraints
below.
REFERENCES specifies a Referential Constraint placed on the
column. This is equivalent to the table level
constraint FOREIGN KEY (ColumnName) REFERENCES
RefTableName [(RefColumnName)]. See the
discussion on table level referential constraint
below.
CHECK specifies a check constraint placed on the
column.
SearchCondition specifies a boolean expression that must not be
false. The result of the boolean expression may
be unknown if a value in the expression is NULL.
See the discussion on a table level check
constraint below. In addition, for a column
definition check constraint, the only column the
search condition can reference is ColumnName.
ConstraintID is an optional name specified for the constraint.
If none is supplied, one is generated, as
described under "Description" below.
DBEFileSetName3 specifies the DBEFileSet to be used for storing
the section associated with the check constraint.
If not specified, the default SECTIONSPACE
DBEFileSet is used. (Refer to syntax for the SET
DEFAULT DBEFILESET statement.)
SQL Syntax--Unique Constraint (Table Level)
{UNIQUE } ( ColumnName [,...]) [CONSTRAINT ConstraintID]
{PRIMARY KEY}
Parameters--Unique Constraint (Table Level)
UNIQUE Each ColumnName shall identify a column of the
table, and the same column shall not be
identified more than once. Also, NOT NULL shall
be specified for each column in this unique
constraint column list.
PRIMARY KEY In addition to the rules for the UNIQUE option,
PRIMARY KEY may only be specified once in a table
definition. It provides a shorthand way of
referencing its particular unique constraint
column list in a referential constraint.
ColumnName [,...] is the unique constraint column list, or key
list, of the constraint. No two unique
constraints may have identical column lists. The
maximum number of columns in a unique column list
is 15. None of the columns may be a LONG data
type.
ConstraintID is an optional name specified for the constraint.
If none is supplied, one is generated, as
described under "Description" below.
SQL Syntax--Referential Constraint (Table Level)
FOREIGN KEY ( FKColumnName [,...]) REFERENCES RefTableName
[( RefColumnName [,...])] [CONSTRAINT ConstraintID]
Parameters--Referential Constraint (Table Level)
FKColumnName [,...] identifies the referencing column list. Each
referencing column shall be a column defined in
the referencing table, and the same column name
shall not be identified more than once. The
number of referencing and referenced columns
would be the same. The maximum number of
columns in a referencing column list is 15.
None of the columns may be a LONG data type.
RefTableName identifies the base table being referenced. If
no RefColumnName list follows this, the base
table must contain a PRIMARY KEY unique
constraint with the correct number of columns,
each of the correct data type.
RefColumnName [,...] identifies the referenced column list. This
column list must be identical to a unique
constraint column list of the referenced table.
ConstraintID is an optional name specified for the
constraint. If none is supplied, one is
generated, as described under "Description"
below.
SQL Syntax--Check Constraint (Table Level)
CHECK (SearchCondition) [CONSTRAINT ConstraintID] [IN DBEFileSetName3]
Parameters--Check Constraint (Table Level)
CHECK specifies a check constraint.
SearchCondition specifies a boolean expression for the check
constraint. The result of the boolean
expression must not be false for any row of the
table. The result may be unknown if a column
that is part of the expression is NULL. The
search condition may only contain LONG columns
if they are within long column functions.[REV
BEG] (Refer to long column functions in the
"Expressions" and "Data Types" chapters.) The
search condition cannot contain a subquery,
host variable, aggregate function, built-in
variable, local variable, procedure parameter,
dynamic parameter, TID function, current
function, or USER. Refer to the chapter,
"Constraints, Procedures, and Rules," for more
information on check constraints.[REV END]
ConstraintID is an optional name specified for the
constraint. If none is supplied, one is
generated, as described under "Description"
below.
DBEFileSetName3 specifies the DBEFileSet to be used for storing
the section associated with the check
constraint. If not specified, the default
SECTIONSPACE DBEFileSet is used. (Refer to
syntax for the SET DEFAULT DBEFILESET
statement.)
Description
* PUBLIC, PUBLICROW, PUBLICREAD, and PRIVATE are locking modes.
They define the type of locking ALLBASE/SQL uses automatically
when the table is accessed. The LOCK TABLE statement can be used
to override automatic locking during any transaction, if the
override is to a more restrictive lock. If no locking mode is
specified, PRIVATE is assumed. For complete information on
locking, refer to the chapter "Concurrency Control through Locks
and Isolation Levels."
* For nonhash tables, CREATE TABLE simply enters the new table's
definition into the system catalog. Until you insert a row into
the new table, the table does not occupy any storage. For hash
tables, the number of primary pages is allocated at CREATE TABLE
time.
* Data and index values of columns defined as NOT CASE SENSITIVE are
not converted to upper case when stored. However, during
comparison, sorting, and indexing operations, upper and lower case
letters are considered equivalent. If a case sensitive column is
compared to a column that is not case sensitive, both columns are
treated as case sensitive. When defining a referential
constraint, the case sensitivity of the referenced and referencing
columns must match.
The NOT CASE SENSITIVE clause has no effect if the character set
does not differentiate between upper and lower case, such as
Chinese.
* Upper and lower case extended characters are treated as
equivalent. They are compared to the collation table of a
specific language regardless of case.
* If no DEFAULT clause is given for a column in the table, an
implicit DEFAULT NULL is assumed. Any INSERT statement, which
does not include a column for which a default has been declared,
causes the default value to be inserted into that column for all
rows inserted.
* For a CHAR column, if the specified default value is shorter in
length than the target column, it is padded with blanks. For a
CHAR or VARCHAR column, if the specified default value is longer
than the target column, it is truncated.
* For a BINARY column, if the specified default value is shorter in
length than the target column, it is padded with zeroes. For a
BINARY or VARBINARY column, if the specified default value is
longer than the target column, it is truncated.
* If a constraint is defined without a ConstraintID, one is
generated of the following form:
SQLCON_uniqueid
where the uniqueid is unique across all constraints. You cannot
define a constraint starting with SQLCON_. All constraint names
must be unique for a given owner, regardless of which table they
are in.
* Unique constraints are managed through the use of B-tree indexes
unless the constraint is named and its name is referenced in the
HASH ON CONSTRAINT clause. If the name is referenced in the
CLUSTERING ON CONSTRAINT clause, the B-tree index is clustered.
* Referential constraints are managed through the use of virtual
indexes. A virtual index is created by ALLBASE/SQL. Virtual
indexes can be clustered with respect to the referencing columns'
values if the constraint is named in the CLUSTERING ON CONSTRAINT
clause.
* The behavior by which integrity constraints are enforced is
determined by the setting of the SET DML ATOMICITY and SET
CONSTRAINTS statements. Refer to the discussion of these
statements in this chapter for more information.
* Unique constraint indexes use space in this table's DBEFileSet;
but referential constraint virtual indexes use space in the
referenced table's DBEFileSet.
* If the HASH or CLUSTERING ON CONSTRAINT clause is used without a
constraint name, the PRIMARY KEY of the table is used. If a
PRIMARY KEY is not defined, an error results.
* At most 15 columns may be used in a unique or referential
constraint key. The maximum length of the index key for unique or
referential constraints is obtained from the following formula:
(NumberOfColumns + 3)* 2 + SumColumnLengths + 10 = 1024
An extra 2 bytes must be added for each column that allows NULLS
or is a VARCHAR data type.
* The data types of the corresponding columns in a referential
constraint's referencing and referenced column lists must be the
same with the following exceptions. CHAR and VARCHAR are allowed
to refer to each other, as are the pairs BINARY and VARBINARY, and
NATIVE CHAR and NATIVE VARCHAR. DECIMAL columns must exactly match
in precision and scale. SMALLINT, INTEGER, FLOAT, and REAL
references cannot refer to a data type other than their same data
type. LONG columns may not be used in integrity constraints.
* You can use the same set of foreign key columns to reference two
different primary keys.
* The maximum size of a hash key is the same as a user-defined index
key, which is determined in the following formula:
(NumberOfHashColumns+2)* 2 + SumKeyColumnLengths + 8 <= 1024
An extra 2 bytes must be added for each column that allows NULLS
or is a VARCHAR datatype.
At most 16 columns are allowed in a hash structure key.
* A hash structure may not be dropped, except by dropping the table
upon which it is defined with the DROP TABLE statement.
* You cannot create a hash structure as a PUBLICROW table.
* If the table is created with a HASH structure, enough empty data
and mixed DBEFiles must exist to contain the primary pages for the
hash table data at the time the table is created. Primary pages
for hash tables cannot be placed in DBEFile0, an index DBEFile, or
a nonempty DBEFile. Similarly, data for nonhash tables cannot be
placed in a DBEFile containing primary pages for hash tables.
* The partition must be already created by the CREATE PARTITION
statement, it must be the default partition, or it must be
specified as NONE.
* The partition number of a table's partition is recorded in any
audit logging generated on that table. Audit logging is done on
any INSERT, UPDATE, or DELETE performed on a table while the
DBEnvironment is enabled for DATA audit logging, unless the table
is in the partition NONE.
* Audit logging is not done on any LONG column data for the table.
* If no partition is specified, the table is placed in the DEFAULT
partition.
* To specify that a table is in no partition, the partition NONE can
be specified.
* Partitions can be created and tables placed in them without DATA
audit logging being enabled for a DBEnvironment. However, the
partition information is only used in audit log records. Thus,
partition information is not utilized until the DBEnvironment has
DATA audit logging enabled through the START DBE NEWLOG statement.
* If the IN DBEFileSetName1 clause is specified for the table or the
IN DBEFileSetName2 clause is specified for a long column, but the
table owner does not have TABLESPACE authority for the specified
DBEFileSet, a warning is issued and the default TABLESPACE
DBEFileSet is used instead. (Refer to syntax for the GRANT
statement and the SET DEFAULT DBEFILESET statement.)
* If the IN DBEFileSetName3 clause is specified for a check
constraint, but the table owner does not have SECTIONSPACE
authority for the specified DBEFileSet, a warning is issued and
the default SECTIONSPACE DBEFileSet is used instead. (Refer to
syntax for the GRANT statement and the SET DEFAULT DBEFILESET
statement.)
Authorization
You must have RESOURCE or DBA authority to use this statement. To define
referential constraints, the table owner must have REFERENCES authority
on the referenced table and referenced columns, own the referenced table,
or have DBA authority for the life of the referential constraint. The
REVOKE, DROP GROUP, and REMOVE FROM GROUP statements are not permitted if
they remove REFERENCES authority from the table's owner until the
referential constraint or table is dropped or ownership is transferred to
someone else.
To specify a DBEFileSetName for a long column, the table owner must have
TABLESPACE authority on the referenced DBEFileSet.
To specify a DBEFileSetName for a check constraint, the section owner
must have SECTIONSPACE authority on the referenced DBEFileSet.
Examples
1. Creating and accessing tables
This public table is accessible to any user or program that can
start a DBE session. It is also accessible by concurrent
transactions.
CREATE PUBLIC TABLE PurchDB.SupplyPrice
(PartNumber CHAR(16) NOT NULL,
VendorNumber INTEGER NOT NULL,
VendPartNumber CHAR(16) NOT NULL,
UnitPrice DECIMAL(10,2),
DeliveryDays SMALLINT DEFAULT 0,
DiscountQty SMALLINT)
IN PARTITION PartsPart
IN PurchFS;
REVOKE ALL PRIVILEGES ON PurchDB.SupplyPrice FROM PUBLIC
GRANT SELECT,UPDATE ON Purch.DB.SupplyPrice TO Accounting
Now only the DBA and members of authorization group Accounting can
access the table. Later, the accounting department manager is
given control.
TRANSFER OWNERSHIP OF PurchDB.SupplyPrice TO MGR@ACCOUNT
2. Creating a table using constraints and LONG columns
In this example, the tables are created with the PUBLIC option so
as to be accessible to any user or program that can start a DBE
session. RecDB.Clubs defines those clubs which can have members
and hold events, as shown by the constraint Members_FK.
RecDB.Members defines those members who can have events for
certain clubs, as shown by constraint Events_FK. The LONG column
Results is used to hold a text file containing the results of a
completed event. No date can be entered for an event that is
prior to the current date. RecDB.Members and RecDB.Events are
both created PUBLICROW since they are small tables on which a
large amount of concurrent access is expected.
CREATE PUBLIC TABLE RecDB.Clubs
(ClubName CHAR(15) NOT NULL
PRIMARY KEY CONSTRAINT Clubs_PK,
ClubPhone SMALLINT,
Activity CHAR(18))
NOT CASE SENSITIVE
IN RecFS
CREATE PUBLICROW TABLE RecDB.Members
(MemberName CHAR(20) NOT NULL,
Club CHAR(15) NOT NULL,
MemberPhone SMALLINT,
PRIMARY KEY (MemberName, Club) CONSTRAINT Members_PK,
FOREIGN KEY (Club) REFERENCES RecDB.Clubs (ClubName)
CONSTRAINT Members_FK)
IN RecFS
CREATE PUBLICROW TABLE RecDB.Events
(SponsorClub CHAR(15),
Event CHAR(30),
Date DATE DEFAULT CURRENT_DATE,
CHECK (Date >= '1990-01-01') CONSTRAINT Events_Date_Ck,
Time TIME,
Coordinator CHAR(20),
Results LONG VARBINARY(10000) IN LongFS,
FOREIGN KEY (Coordinator, SponsorClub)
REFERENCES RecDB.Members (MemberName, Club)
CONSTRAINT Events_FK)
IN RecFS
3. Creating a table with a hash structure
BEGIN WORK
Statements to create a DBEFile and add it to a DBEFileSet should
be in the same transaction as the statement to create the hash
structure. This makes it impossible for other transactions to use
the new DBEFile for hashing before the hash structure is created.
CREATE DBEFILE PurchHashF1 WITH PAGES = 120,
NAME = 'PurchHF1',
TYPE = TABLE
ADD DBEFILE PurchHashF1
TO DBEFILESET PurchFS
CREATE PUBLIC TABLE PurchDB.Vendors
(VendorNumber INTEGER NOT NULL,
VendorName CHAR(30) NOT NULL,
ContactName CHAR(30),
PhoneNumber CHAR(15),
VendorStreet CHAR(30) NOT NULL,
VendorCity CHAR(20) NOT NULL,
VendorState CHAR(2) NOT NULL,
VendorZipCode CHAR(10) NOT NULL,
VendorRemarks VARCHAR(60) )
UNIQUE HASH ON (VendorNumber) PAGES = 101
IN PurchFS
COMMIT WORK
4. Specify a DBEFileSet for a Check Constraint in the Column
Definition
CREATE PUBLIC TABLE RecDB.Events
(SponsorClub CHAR(15),
Event CHAR(30),
Date DATE DEFAULT CURRENT_DATE,
CHECK (Date >= '1990-01-01') CONSTRAINT Events_Date_Ck
IN RecFS,
Time TIME,
Coordinator CHAR(20),
Results LONG VARBINARY(10000) IN LongFS,
FOREIGN KEY (Coordinator, SponsorClub)
REFERENCES RecDB.Members (MemberName, Club)
CONSTRAINT Events_FK)
IN RecFS;
MPE/iX 5.5 Documentation