Schema API
A Drupal schema definition is an array structure representing one or
more tables and their related keys and indexes. A schema is defined by
hook_schema(), which usually lives in a modulename.install file.
By implementing hook_schema() and specifying the tables your module
declares, you can easily create and drop these tables on all
supported database engines. You don't have to deal with the
different SQL dialects for table creation and alteration of the
supported database engines.
hook_schema() should return an array with a key for each table that
the module defines.
The following keys are defined:
- 'description': A string describing this table and its purpose.
References to other tables should be enclosed in
curly-brackets. For example, the node_revisions table
description field might contain "Stores per-revision title and
body data for each {node}."
- 'fields': An associative array ('fieldname' => specification)
that describes the table's database columns. The specification
is also an array. The following specification parameters are defined:
- 'description': A string describing this field and its purpose.
References to other tables should be enclosed in
curly-brackets. For example, the node table vid field
description might contain "Always holds the largest (most
recent) {node_revisions}.vid value for this nid."
- 'type': The generic datatype: 'varchar', 'int', 'serial'
'float', 'numeric', 'text', 'blob' or 'datetime'. Most types
just map to the according database engine specific
datatypes. Use 'serial' for auto incrementing fields. This
will expand to 'int auto_increment' on mysql.
- 'size': The data size: 'tiny', 'small', 'medium', 'normal',
'big'. This is a hint about the largest value the field will
store and determines which of the database engine specific
datatypes will be used (e.g. on MySQL, TINYINT vs. INT vs. BIGINT).
'normal', the default, selects the base type (e.g. on MySQL,
INT, VARCHAR, BLOB, etc.).
Not all sizes are available for all data types. See
db_type_map() for possible combinations.
- 'not null': If true, no NULL values will be allowed in this
database column. Defaults to false.
- 'default': The field's default value. The PHP type of the
value matters: '', '0', and 0 are all different. If you
specify '0' as the default value for a type 'int' field it
will not work because '0' is a string containing the
character "zero", not an integer.
- 'length': The maximal length of a type 'varchar' or 'text'
field. Ignored for other field types.
- 'unsigned': A boolean indicating whether a type 'int', 'float'
and 'numeric' only is signed or unsigned. Defaults to
FALSE. Ignored for other field types.
- 'precision', 'scale': For type 'numeric' fields, indicates
the precision (total number of significant digits) and scale
(decimal digits right of the decimal point). Both values are
mandatory. Ignored for other field types.
All parameters apart from 'type' are optional except that type
'numeric' columns must specify 'precision' and 'scale'.
- 'primary key': An array of one or more key column specifiers (see below)
that form the primary key.
- 'unique key': An associative array of unique keys ('keyname' =>
specification). Each specification is an array of one or more
key column specifiers (see below) that form a unique key on the table.
- 'indexes': An associative array of indexes ('indexame' =>
specification). Each specification is an array of one or more
key column specifiers (see below) that form an index on the
table.
A key column specifier is either a string naming a column or an
array of two elements, column name and length, specifying a prefix
of the named column.
As an example, here is a SUBSET of the schema definition for
Drupal's 'node' table. It show four fields (nid, vid, type, and
title), the primary key on field 'nid', a unique key named 'vid' on
field 'vid', and two indexes, one named 'nid' on field 'nid' and
one named 'node_title_type' on the field 'title' and the first four
bytes of the field 'type':
$schema['node'] = array(
'fields' => array(
'nid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
'vid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
'type' => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => ''),
'title' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
),
'primary key' => array('nid'),
'unique keys' => array(
'vid' => array('vid')
),
'indexes' => array(
'nid' => array('nid'),
'node_title_type' => array('title', array('type', 4)),
),
);
@see drupal_install_schema()
Functions