manual.txt
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1762k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1.      `cp1251_koi8', but you can easily add new mappings by editing the
  2.      `sql/convert.cc' file in the *MySQL* source distribution.  The
  3.      default mapping can be restored by using a `character_set_name'
  4.      value of `DEFAULT'.
  5.      Note that the syntax for setting the `CHARACTER SET' option differs
  6.      from the syntax for setting the other options.
  7. `PASSWORD = PASSWORD('some password')'
  8.      Set the password for the current user. Any non-anonymous user can
  9.      change his own password!
  10. `PASSWORD FOR user = PASSWORD('some password')'
  11.      Set the password for a specific user on the current server host.
  12.      Only a user with access to the `mysql' database can do this.  The
  13.      user should be given in `user@hostname' format, where `user' and
  14.      `hostname' are exactly as they are listed in the `User' and `Host'
  15.      columns of the `mysql.user' table entry.  For example, if you had
  16.      an entry with `User' and `Host' fields of `'bob'' and
  17.      `'%.loc.gov'', you would write:
  18.           mysql> SET PASSWORD FOR bob@"%.loc.gov" = PASSWORD("newpass");
  19.           
  20.           or
  21.           
  22.           mysql> UPDATE mysql.user SET password=PASSWORD("newpass") where user="bob' and host="%.loc.gov";
  23. `SQL_AUTO_IS_NULL = 0 | 1'
  24.      If set to `1' (default) then one can find the last inserted row
  25.      for a table with an auto_increment row with the following
  26.      construct: `WHERE auto_increment_column IS NULL'.  This is used by
  27.      some ODBC programs like Access.
  28. `AUTOCOMMIT= 0 | 1'
  29.      If set to `1' all changes to a table will be done at once. To start
  30.      a multi-command transaction, you have to use the `BEGIN'
  31.      statement. *Note COMMIT::. If set to `0' you have to use `COMMIT' /
  32.      `ROLLBACK' to accept/revoke that transaction. *Note COMMIT::.  Note
  33.      that when you change from not `AUTOCOMMIT' mode to `AUTOCOMMIT'
  34.      mode, *MySQL* will do an automatic `COMMIT' on any open
  35.      transactions.
  36. `SQL_BIG_TABLES = 0 | 1'
  37.      If set to `1', all temporary tables are stored on disk rather than
  38.      in memory.  This will be a little slower, but you will not get the
  39.      error `The table tbl_name is full' for big `SELECT' operations that
  40.      require a large temporary table.  The default value for a new
  41.      connection is `0' (that is, use in-memory temporary tables).
  42. `SQL_BIG_SELECTS = 0 | 1'
  43.      If set to `0', *MySQL* will abort if a `SELECT' is attempted that
  44.      probably will take a very long time. This is useful when an
  45.      inadvisable `WHERE' statement has been issued. A big query is
  46.      defined as a `SELECT' that probably will have to examine more than
  47.      `max_join_size' rows.  The default value for a new connection is
  48.      `1' (which will allow all `SELECT' statements).
  49. `SQL_BUFFER_RESULT = 0 | 1'
  50.      `SQL_BUFFER_RESULT' will force the result from `SELECT''s to be
  51.      put into a temporary table. This will help *MySQL* free the table
  52.      locks early and will help in cases where it takes a long time to
  53.      send the result set to the client.
  54. `SQL_LOW_PRIORITY_UPDATES = 0 | 1'
  55.      If set to `1', all `INSERT', `UPDATE', `DELETE', and and `LOCK
  56.      TABLE WRITE' statements wait until there is no pending `SELECT' or
  57.      `LOCK TABLE READ' on the affected table.
  58. `SQL_MAX_JOIN_SIZE = value | DEFAULT'
  59.      Don't allow `SELECT's that will probably need to examine more than
  60.      `value' row combinations.  By setting this value, you can catch
  61.      `SELECT's where keys are not used properly and that would probably
  62.      take a long time. Setting this to a value other than `DEFAULT'
  63.      will reset the `SQL_BIG_SELECTS' flag.  If you set the
  64.      `SQL_BIG_SELECTS' flag again, the `SQL_MAX_JOIN_SIZE' variable
  65.      will be ignored.  You can set a default value for this variable by
  66.      starting `mysqld' with `-O max_join_size=#'.
  67. `SQL_SAFE_MODE = 0 | 1'
  68.      If set to `1', *MySQL* will abort if an `UPDATE' or `DELETE' is
  69.      attempted that doesn't use a key or `LIMIT' in the `WHERE' clause.
  70.      This makes it possible to catch wrong updates when creating SQL
  71.      commands by hand.
  72. `SQL_SELECT_LIMIT = value | DEFAULT'
  73.      The maximum number of records to return from `SELECT' statements.
  74.      If a `SELECT' has a `LIMIT' clause, the `LIMIT' takes precedence
  75.      over the value of `SQL_SELECT_LIMIT'.  The default value for a new
  76.      connection is "unlimited." If you have changed the limit, the
  77.      default value can be restored by using a `SQL_SELECT_LIMIT' value
  78.      of `DEFAULT'.
  79. `SQL_LOG_OFF = 0 | 1'
  80.      If set to `1', no logging will be done to the standard log for this
  81.      client, if the client has the *process* privilege.  This does not
  82.      affect the update log!
  83. `SQL_LOG_UPDATE = 0 | 1'
  84.      If set to `0', no logging will be done to the update log for the
  85.      client, if the client has the *process* privilege.  This does not
  86.      affect the standard log!
  87. `SQL_QUOTE_SHOW_CREATE = 0 | 1'
  88.      If set to `1', `SHOW CREATE TABLE' will quote table and column
  89.      names. This is *on* by default, for replication of tables with
  90.      fancy column names to work.  *Note `SHOW CREATE TABLE': SHOW
  91.      CREATE TABLE.
  92. `TIMESTAMP = timestamp_value | DEFAULT'
  93.      Set the time for this client.  This is used to get the original
  94.      timestamp if you use the update log to restore rows.
  95. `LAST_INSERT_ID = #'
  96.      Set the value to be returned from `LAST_INSERT_ID()'. This is
  97.      stored in the update log when you use `LAST_INSERT_ID()' in a
  98.      command that updates a table.
  99. `INSERT_ID = #'
  100.      Set the value to be used by the following `INSERT' or `ALTER TABLE'
  101.      command when inserting an `AUTO_INCREMENT' value.  This is mainly
  102.      used with the update log.
  103. `GRANT' and `REVOKE' Syntax
  104. ===========================
  105.      GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
  106.          ON {tbl_name | * | *.* | db_name.*}
  107.          TO user_name [IDENTIFIED BY 'password']
  108.              [, user_name [IDENTIFIED BY 'password'] ...]
  109.          [WITH GRANT OPTION]
  110.      
  111.      REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
  112.          ON {tbl_name | * | *.* | db_name.*}
  113.          FROM user_name [, user_name ...]
  114. `GRANT' is implemented in *MySQL* Version 3.22.11 or later. For earlier
  115. *MySQL* versions, the `GRANT' statement does nothing.
  116. The `GRANT' and `REVOKE' commands allow system administrators to grant
  117. and revoke rights to *MySQL* users at four privilege levels:
  118. *Global level*
  119.      Global privileges apply to all databases on a given server. These
  120.      privileges are stored in the `mysql.user' table.
  121. *Database level*
  122.      Database privileges apply to all tables in a given database. These
  123.      privileges are stored in the `mysql.db' and `mysql.host' tables.
  124. *Table level*
  125.      Table privileges apply to all columns in a given table. These
  126.      privileges are stored in the `mysql.tables_priv' table.
  127. *Column level*
  128.      Column privileges apply to single columns in a given table. These
  129.      privileges are stored in the `mysql.columns_priv' table.
  130. For examples of how `GRANT' works, see *Note Adding users::.
  131. For the `GRANT' and `REVOKE' statements, `priv_type' may be specified
  132. as any of the following:
  133.      ALL PRIVILEGES      FILE                RELOAD
  134.      ALTER               INDEX               SELECT
  135.      CREATE              INSERT              SHUTDOWN
  136.      DELETE              PROCESS             UPDATE
  137.      DROP                REFERENCES          USAGE
  138. `ALL' is a synonym for `ALL PRIVILEGES'.  `REFERENCES' is not yet
  139. implemented.  `USAGE' is currently a synonym for "no privileges."  It
  140. can be used when you want to create a user that has no privileges.
  141. To revoke the *grant* privilege from a user, use a `priv_type' value of
  142. `GRANT OPTION':
  143.      REVOKE GRANT OPTION ON ... FROM ...;
  144. The only `priv_type' values you can specify for a table are `SELECT',
  145. `INSERT', `UPDATE', `DELETE', `CREATE', `DROP', `GRANT', `INDEX', and
  146. `ALTER'.
  147. The only `priv_type' values you can specify for a column (that is, when
  148. you use a `column_list' clause) are `SELECT', `INSERT', and `UPDATE'.
  149. You can set global privileges by using `ON *.*' syntax.  You can set
  150. database privileges by using `ON db_name.*' syntax. If you specify `ON
  151. *' and you have a current database, you will set the privileges for
  152. that database.  (*WARNING:* If you specify `ON *' and you _don't_ have
  153. a current database, you will affect the global privileges!)
  154. In order to accommodate granting rights to users from arbitrary hosts,
  155. *MySQL* supports specifying the `user_name' value in the form
  156. `user@host'.  If you want to specify a `user' string containing special
  157. characters (such as `-'), or a `host' string containing special
  158. characters or wild-card characters (such as `%'), you can quote the
  159. user or host name (for example, `'test-user'@'test-hostname'').
  160. You can specify wild cards in the hostname.  For example,
  161. `user@"%.loc.gov"' applies to `user' for any host in the `loc.gov'
  162. domain, and `user@"144.155.166.%"' applies to `user' for any host in
  163. the `144.155.166' class C subnet.
  164. The simple form `user' is a synonym for `user@"%"'.  *NOTE:* If you
  165. allow anonymous users to connect to the *MySQL* server (which is the
  166. default), you should also add all local users as `user@localhost'
  167. because otherwise the anonymous user entry for the local host in the
  168. `mysql.user' table will be used when the user tries to log into the
  169. *MySQL* server from the local machine!  Anonymous users are defined by
  170. inserting entries with `User=''' into the `mysql.user' table. You can
  171. verify if this applies to you by executing this query:
  172.      mysql> SELECT Host,User FROM mysql.user WHERE User='';
  173. For the moment, `GRANT' only supports host, table, database, and column
  174. names up to 60 characters long. A user name can be up to 16 characters.
  175. The privileges for a table or column are formed from the logical OR of
  176. the privileges at each of the four privilege levels.  For example, if
  177. the `mysql.user' table specifies that a user has a global *select*
  178. privilege, this can't be denied by an entry at the database, table, or
  179. column level.
  180. The privileges for a column can be calculated as follows:
  181.      global privileges
  182.      OR (database privileges AND host privileges)
  183.      OR table privileges
  184.      OR column privileges
  185. In most cases, you grant rights to a user at only one of the privilege
  186. levels, so life isn't normally as complicated as above. The details of
  187. the privilege-checking procedure are presented in *Note Privilege
  188. system::.
  189. If you grant privileges for a user/hostname combination that does not
  190. exist in the `mysql.user' table, an entry is added and remains there
  191. until deleted with a `DELETE' command.  In other words, `GRANT' may
  192. create `user' table entries, but `REVOKE' will not remove them; you
  193. must do that explicitly using `DELETE'.
  194. In *MySQL* Version 3.22.12 or later, if a new user is created or if you
  195. have global grant privileges, the user's password will be set to the
  196. password specified by the `IDENTIFIED BY' clause, if one is given.  If
  197. the user already had a password, it is replaced by the new one.
  198. *WARNING:* If you create a new user but do not specify an `IDENTIFIED
  199. BY' clause, the user has no password.  This is insecure.
  200. Passwords can also be set with the `SET PASSWORD' command.  *Note `SET
  201. OPTION': SET OPTION.
  202. If you grant privileges for a database, an entry in the `mysql.db'
  203. table is created if needed. When all privileges for the database have
  204. been removed with `REVOKE', this entry is deleted.
  205. If a user doesn't have any privileges on a table, the table is not
  206. displayed when the user requests a list of tables (for example, with a
  207. `SHOW TABLES' statement).
  208. The `WITH GRANT OPTION' clause gives the user the ability to give to
  209. other users any privileges the user has at the specified privilege
  210. level.  You should be careful to whom you give the *grant* privilege,
  211. as two users with different privileges may be able to join privileges!
  212. You cannot grant another user a privilege you don't have yourself; the
  213. *grant* privilege allows you to give away only those privileges you
  214. possess.
  215. Be aware that when you grant a user the *grant* privilege at a
  216. particular privilege level, any privileges the user already possesses
  217. (or is given in the future!) at that level are also grantable by that
  218. user.  Suppose you grant a user the *insert* privilege on a database.
  219. If you then grant the *select* privilege on the database and specify
  220. `WITH GRANT OPTION', the user can give away not only the *select*
  221. privilege, but also *insert*.  If you then grant the *update* privilege
  222. to the user on the database, the user can give away the *insert*,
  223. *select* and *update*.
  224. You should not grant *alter* privileges to a normal user.  If you do
  225. that, the user can try to subvert the privilege system by renaming
  226. tables!
  227. Note that if you are using table or column privileges for even one
  228. user, the server examines table and column privileges for all users and
  229. this will slow down *MySQL* a bit.
  230. When `mysqld' starts, all privileges are read into memory.  Database,
  231. table, and column privileges take effect at once, and user-level
  232. privileges take effect the next time the user connects.  Modifications
  233. to the grant tables that you perform using `GRANT' or `REVOKE' are
  234. noticed by the server immediately.  If you modify the grant tables
  235. manually (using `INSERT', `UPDATE', etc.), you should execute a `FLUSH
  236. PRIVILEGES' statement or run `mysqladmin flush-privileges' to tell the
  237. server to reload the grant tables.  *Note Privilege changes::.
  238. The biggest differences between the ANSI SQL and *MySQL* versions of
  239. `GRANT' are:
  240.    * In *MySQL* privileges are given for an username + hostname
  241.      combination and not only for an username.
  242.    * ANSI SQL doesn't have global or database-level privileges, and
  243.      ANSI SQL doesn't support all privilege types that *MySQL* supports.
  244.      *MySQL* doesn't support the ANSI SQL `TRIGGER', `EXECUTE' or
  245.      `UNDER' privileges.
  246.    * ANSI SQL privileges are structured in a hierarchal manner. If you
  247.      remove an user, all privileges the user has granted are revoked. In
  248.      *MySQL* the granted privileges are not automaticly revoked, but
  249.      you have to revoke these yourself if needed.
  250.    * If you in *MySQL* have the `INSERT' grant on only part of the
  251.      columns in a table, you can execute `INSERT' statements on the
  252.      table; The columns for which you don't have the `INSERT' privilege
  253.      will set to their default values. ANSI SQL requires you to have the
  254.      `INSERT' privilege on all columns.
  255.    * When you drop a table in ANSI SQL, all privileges for the table
  256.      are revoked.  If you revoke a privilege in ANSI SQL, all
  257.      privileges that were granted based on this privilege are also
  258.      revoked. In *MySQL*, privileges can be dropped only with explicit
  259.      `REVOKE' commands or by manipulating the *MySQL* grant tables.
  260. `CREATE INDEX' Syntax
  261. =====================
  262.      CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )
  263. The `CREATE INDEX' statement doesn't do anything in *MySQL* prior to
  264. Version 3.22.  In Version 3.22 or later, `CREATE INDEX' is mapped to an
  265. `ALTER TABLE' statement to create indexes.  *Note `ALTER TABLE': ALTER
  266. TABLE.
  267. Normally, you create all indexes on a table at the time the table itself
  268. is created with `CREATE TABLE'.  *Note `CREATE TABLE': CREATE TABLE.
  269. `CREATE INDEX' allows you to add indexes to existing tables.
  270. A column list of the form `(col1,col2,...)' creates a multiple-column
  271. index.  Index values are formed by concatenating the values of the given
  272. columns.
  273. For `CHAR' and `VARCHAR' columns, indexes can be created that use only
  274. part of a column, using `col_name(length)' syntax.  (On `BLOB' and
  275. `TEXT' columns the length is required). The statement shown below
  276. creates an index using the first 10 characters of the `name' column:
  277.      mysql> CREATE INDEX part_of_name ON customer (name(10));
  278. Because most names usually differ in the first 10 characters, this
  279. index should not be much slower than an index created from the entire
  280. `name' column.  Also, using partial columns for indexes can make the
  281. index file much smaller, which could save a lot of disk space and might
  282. also speed up `INSERT' operations!
  283. Note that you can only add an index on a column that can have `NULL'
  284. values or on a `BLOB'/`TEXT' column if you are using *MySQL* Version
  285. 3.23.2 or newer and are using the `MyISAM' table type.
  286. For more information about how *MySQL* uses indexes, see *Note *MySQL*
  287. indexes: MySQL indexes.
  288. `FULLTEXT' indexes can index only `VARCHAR' and `TEXT' columns, and
  289. only in `MyISAM' tables. `FULLTEXT' indexes are available in *MySQL*
  290. Version 3.23.23 and later.  *Note MySQL full-text search::.
  291. `DROP INDEX' Syntax
  292. ===================
  293.      DROP INDEX index_name ON tbl_name
  294. `DROP INDEX' drops the index named `index_name' from the table
  295. `tbl_name'.  `DROP INDEX' doesn't do anything in *MySQL* prior to
  296. Version 3.22.  In Version 3.22 or later, `DROP INDEX' is mapped to an
  297. `ALTER TABLE' statement to drop the index.  *Note `ALTER TABLE': ALTER
  298. TABLE.
  299. Comment Syntax
  300. ==============
  301. The *MySQL* server supports the `# to end of line', `-- to end of line'
  302. and `/* in-line or multiple-line */' comment styles:
  303.      mysql> select 1+1;     # This comment continues to the end of line
  304.      mysql> select 1+1;     -- This comment continues to the end of line
  305.      mysql> select 1 /* this is an in-line comment */ + 1;
  306.      mysql> select 1+
  307.      /*
  308.      this is a
  309.      multiple-line comment
  310.      */
  311.      1;
  312. Note that the `--' comment style requires you to have at least one space
  313. after the `--'!
  314. Although the server understands the comment syntax just described,
  315. there are some limitations on the way that the `mysql' client parses
  316. `/* ... */' comments:
  317.    * Single-quote and double-quote characters are taken to indicate the
  318.      beginning of a quoted string, even within a comment.  If the quote
  319.      is not matched by a second quote within the comment, the parser
  320.      doesn't realize the comment has ended.  If you are running `mysql'
  321.      interactively, you can tell that it has gotten confused like this
  322.      because the prompt changes from `mysql>' to `'>' or `">'.
  323.    * A semicolon is taken to indicate the end of the current SQL
  324.      statement and anything following it to indicate the beginning of
  325.      the next statement.
  326. These limitations apply both when you run `mysql' interactively and
  327. when you put commands in a file and tell `mysql' to read its input from
  328. that file with `mysql < some-file'.
  329. *MySQL* doesn't support the `--' ANSI SQL comment style.  *Note Missing
  330. comments::.
  331. `CREATE FUNCTION/DROP FUNCTION' Syntax
  332. ======================================
  333.      CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|REAL|INTEGER}
  334.             SONAME shared_library_name
  335.      
  336.      DROP FUNCTION function_name
  337. A user-definable function (UDF) is a way to extend *MySQL* with a new
  338. function that works like native (built in) *MySQL* functions such as
  339. `ABS()' and `CONCAT()'.
  340. `AGGREGATE' is a new option for *MySQL* Version 3.23.  An `AGGREGATE'
  341. function works exactly like a native *MySQL* `GROUP' function like
  342. `SUM' or `COUNT()'.
  343. `CREATE FUNCTION' saves the function's name, type, and shared library
  344. name in the `mysql.func' system table.  You must have the *insert* and
  345. *delete* privileges for the `mysql' database to create and drop
  346. functions.
  347. All active functions are reloaded each time the server starts, unless
  348. you start `mysqld' with the `--skip-grant-tables' option.  In this
  349. case, UDF initialization is skipped and UDFs are unavailable.  (An
  350. active function is one that has been loaded with `CREATE FUNCTION' and
  351. not removed with `DROP FUNCTION'.)
  352. For instructions on writing user-definable functions, see *Note Adding
  353. functions::.  For the UDF mechanism to work, functions must be written
  354. in C or C++, your operating system must support dynamic loading and you
  355. must have compiled `mysqld' dynamically (not statically).
  356. Is MySQL Picky About Reserved Words?
  357. ====================================
  358. A common problem stems from trying to create a table with column names
  359. that use the names of datatypes or functions built into *MySQL*, such as
  360. `TIMESTAMP' or `GROUP'.  You're allowed to do it (for example, `ABS' is
  361. an allowed column name), but whitespace is not allowed between a
  362. function name and the `(' when using functions whose names are also
  363. column names.
  364. The following words are explicitly reserved in *MySQL*. Most of them
  365. are forbidden by ANSI SQL92 as column and/or table names (for example,
  366. `group').  A few are reserved because *MySQL* needs them and is
  367. (currently) using a `yacc' parser:
  368. `action'           `add'              `aggregate'        `all'
  369. `alter'            `after'            `and'              `as'
  370. `asc'              `avg'              `avg_row_length'   `auto_increment'
  371. `between'          `bigint'           `bit'              `binary'
  372. `blob'             `bool'             `both'             `by'
  373. `cascade'          `case'             `char'             `character'
  374. `change'           `check'            `checksum'         `column'
  375. `columns'          `comment'          `constraint'       `create'
  376. `cross'            `current_date'     `current_time'     `current_timestamp'
  377. `data'             `database'         `databases'        `date'
  378. `datetime'         `day'              `day_hour'         `day_minute'
  379. `day_second'       `dayofmonth'       `dayofweek'        `dayofyear'
  380. `dec'              `decimal'          `default'          `delayed'
  381. `delay_key_write'  `delete'           `desc'             `describe'
  382. `distinct'         `distinctrow'      `double'           `drop'
  383. `end'              `else'             `escape'           `escaped'
  384. `enclosed'         `enum'             `explain'          `exists'
  385. `fields'           `file'             `first'            `float'
  386. `float4'           `float8'           `flush'            `foreign'
  387. `from'             `for'              `full'             `function'
  388. `global'           `grant'            `grants'           `group'
  389. `having'           `heap'             `high_priority'    `hour'
  390. `hour_minute'      `hour_second'      `hosts'            `identified'
  391. `ignore'           `in'               `index'            `infile'
  392. `inner'            `insert'           `insert_id'        `int'
  393. `integer'          `interval'         `int1'             `int2'
  394. `int3'             `int4'             `int8'             `into'
  395. `if'               `is'               `isam'             `join'
  396. `key'              `keys'             `kill'             `last_insert_id'
  397. `leading'          `left'             `length'           `like'
  398. `lines'            `limit'            `load'             `local'
  399. `lock'             `logs'             `long'             `longblob'
  400. `longtext'         `low_priority'     `max'              `max_rows'
  401. `match'            `mediumblob'       `mediumtext'       `mediumint'
  402. `middleint'        `min_rows'         `minute'           `minute_second'
  403. `modify'           `month'            `monthname'        `myisam'
  404. `natural'          `numeric'          `no'               `not'
  405. `null'             `on'               `optimize'         `option'
  406. `optionally'       `or'               `order'            `outer'
  407. `outfile'          `pack_keys'        `partial'          `password'
  408. `precision'        `primary'          `procedure'        `process'
  409. `processlist'      `privileges'       `read'             `real'
  410. `references'       `reload'           `regexp'           `rename'
  411. `replace'          `restrict'         `returns'          `revoke'
  412. `rlike'            `row'              `rows'             `second'
  413. `select'           `set'              `show'             `shutdown'
  414. `smallint'         `soname'           `sql_big_tables'   `sql_big_selects'
  415. `sql_low_priority_updates'`sql_log_off'      `sql_log_update'   `sql_select_limit'
  416. `sql_small_result' `sql_big_result'   `sql_warnings'     `straight_join'
  417. `starting'         `status'           `string'           `table'
  418. `tables'           `temporary'        `terminated'       `text'
  419. `then'             `time'             `timestamp'        `tinyblob'
  420. `tinytext'         `tinyint'          `trailing'         `to'
  421. `type'             `use'              `using'            `unique'
  422. `unlock'           `unsigned'         `update'           `usage'
  423. `values'           `varchar'          `variables'        `varying'
  424. `varbinary'        `with'             `write'            `when'
  425. `where'            `year'             `year_month'       `zerofill'
  426. The following symbols (from the table above) are disallowed by ANSI SQL
  427. but allowed by *MySQL* as column/table names. This is because some of
  428. these names are very natural names and a lot of people have already
  429. used them.
  430.    * `ACTION'
  431.    * `BIT'
  432.    * `DATE'
  433.    * `ENUM'
  434.    * `NO'
  435.    * `TEXT'
  436.    * `TIME'
  437.    * `TIMESTAMP'
  438. MySQL Table Types
  439. *****************
  440. As of *MySQL* Version 3.23.6, you can choose between three basic table
  441. formats (`ISAM', `HEAP' and `MyISAM'.  Newer *MySQL* may support
  442. additional table type (`BDB', `GEMINI' or `INNOBASE'), depending on how
  443. you compile it.
  444. When you create a new table, you can tell *MySQL* which table type it
  445. should use for the table.  *MySQL* will always create a `.frm' file to
  446. hold the table and column definitions.  Depending on the table type,
  447. the index and data will be stored in other files.
  448. The default table type in *MySQL* is `MyISAM'. If you are trying to use
  449. a table type that is not incompiled or activated, *MySQL* will instead
  450. create a table of type `MyISAM'.
  451. You can convert tables between different types with the `ALTER TABLE'
  452. statement. *Note `ALTER TABLE': ALTER TABLE.
  453. Note that *MySQL* supports two different kinds of tables.
  454. Transaction-safe tables (`BDB', `INNOBASE' or `GEMINI') and not
  455. transaction-safe tables (`HEAP', `ISAM', `MERGE', and `MyISAM').
  456. Advantages of transaction-safe tables (TST):
  457.    * Safer. Even if *MySQL* crashes or you get hardware problems, you
  458.      can get your data back, either by automatic recovery or from a
  459.      backup + the transaction log.
  460.    * You can combine many statements and accept these all in one go with
  461.      the `COMMIT' command.
  462.    * You can execute `ROLLBACK' to ignore your changes (if you are not
  463.      running in auto commit mode).
  464.    * If an update fails, all your changes will be restored. (With NTST
  465.      tables all changes that have taken place are permanent)
  466. Advantages of not transaction-safe tables (NTST):
  467.    * Much faster as there is no transcation overhead.
  468.    * Will use less disk space as there is no overhead of transactions.
  469.    * Will use less memory to do updates.
  470. You can combine TST and NTST tables in the same statements to get the
  471. best of both worlds.
  472. MyISAM Tables
  473. =============
  474. `MyISAM' is the default table type in *MySQL* Version 3.23. It's based
  475. on the `ISAM' code and has a lot of useful extensions.
  476. The index is stored in a file with the `.MYI' (MYIndex) extension, and
  477. the data is stored in a file with the `.MYD' (MYData) extension.  You
  478. can check/repair `MyISAM' tables with the `myisamchk' utility. *Note
  479. Crash recovery::.
  480. The following is new in `MyISAM':
  481.    * There is a flag in the `MyISAM' file that indicates whether or not
  482.      the table was closed correctly.  If `mysqld' is started with
  483.      `--myisam-recover', `MyISAM' tables will automaticly be checked
  484.      and/or repaired on open if the table wasn't closed properly.
  485.    * You can `INSERT' new rows in a table without deleted rows, while
  486.      other threads are reading from the table.
  487.    * Support for big files (63-bit) on filesystems/operating systems
  488.      that support big files.
  489.    * All data is stored with the low byte first. This makes the data
  490.      machine and OS independent. The only requirement is that the
  491.      machine uses two's-complement signed integers (as every machine
  492.      for the last 20 years has) and IEEE floating-point format (also
  493.      totally dominant among mainstream machines). The only area of
  494.      machines that may not support binary compatibility are embedded
  495.      systems (because they sometimes have peculiar processors).
  496.      There is no big speed penalty in storing data low byte first; The
  497.      bytes in a table row is normally unaligned and it doesn't take
  498.      that much more power to read an unaligned byte in order than in
  499.      reverse order.  The actual fetch-column-value code is also not
  500.      time critical compared to other code.
  501.    * All number keys are stored with high byte first to give better
  502.      index compression.
  503.    * Internal handling of one `AUTO_INCREMENT' column. `MyISAM' will
  504.      automatically update this on `INSERT/UPDATE'. The `AUTO_INCREMENT'
  505.      value can be reset with `myisamchk'. This will make
  506.      `AUTO_INCREMENT' columns faster (at least 10 %) and old numbers
  507.      will not be reused as with the old ISAM. Note that when an
  508.      `AUTO_INCREMENT' is defined on the end of a multi-part-key the old
  509.      behavior is still present.
  510.    * When inserted in sorted order (as when you are using an
  511.      `AUTO_INCREMENT' column) the key tree will be split so that the
  512.      high node only contains one key. This will improve the space
  513.      utilization in the key tree.
  514.    * `BLOB' and `TEXT' columns can be indexed.
  515.    * `NULL' values are allowed in indexed columns.  This takes 0-1
  516.      bytes/key.
  517.    * Maximum key length is 500 bytes by default (can be changed by
  518.      recompiling).  In cases of keys longer than 250 bytes, a bigger key
  519.      block size than the default of 1024 bytes is used for this key.
  520.    * Maximum number of keys/table is 32 as default. This can be
  521.      enlarged to 64 without having to recompile `myisamchk'.
  522.    * `myisamchk' will mark tables as checked if one runs it with
  523.      `--update-state'. `myisamchk --fast' will only check those tables
  524.      that don't have this mark.
  525.    * `myisamchk -a' stores statistics for key parts (and not only for
  526.      whole keys as in `ISAM').
  527.    * Dynamic size rows will now be much less fragmented when mixing
  528.      deletes with updates and inserts.  This is done by automatically
  529.      combining adjacent deleted blocks and by extending blocks if the
  530.      next block is deleted.
  531.    * `myisampack' can pack `BLOB' and `VARCHAR' columns.
  532. `MyISAM' also supports the following things, which *MySQL* will be able
  533. to use in the near future:
  534.    * Support for a true `VARCHAR' type; A `VARCHAR' column starts with
  535.      a length stored in 2 bytes.
  536.    * Tables with `VARCHAR' may have fixed or dynamic record length.
  537.    * `VARCHAR' and `CHAR' may be up to 64K.  All key segments have
  538.      their own language definition. This will enable *MySQL* to have
  539.      different language definitions per column.
  540.    * A hashed computed index can be used for `UNIQUE'. This will allow
  541.      you to have `UNIQUE' on any combination of columns in a table. (You
  542.      can't search on a `UNIQUE' computed index, however.)
  543. Note that index files are usually much smaller with `MyISAM' than with
  544. `ISAM'. This means that `MyISAM' will normally use less system
  545. resources than `ISAM', but will need more CPU when inserting data into
  546. a compressed index.
  547. The following options to `mysqld' can be used to change the behavior of
  548. `MyISAM' tables:
  549. *Option*                      *Meaning*
  550. `--myisam-recover=#'          Automatic recover of crashed tables.
  551. `-O                           Buffer used when recovering tables.
  552. myisam_sort_buffer_size=#'    
  553. `--delay-key-write-for-all-tables'Don't flush key buffers between writes for
  554.                               any MyISAM table
  555. The automatic recovery is activated if you start mysqld with
  556. `--myisam-recover=#'. *Note Command-line options::.  On open, the table
  557. is checked if it's marked as crashed or if the open count variable for
  558. the table is not 0 and you are running with `--skip-locking'.  If
  559. either of the above is true the following happens.
  560.    * The table is checked for errors.
  561.    * If we found an error, try to do a fast repair (with sorting and
  562.      without re-creating the data file) of the table.
  563.    * If the repair fails because of an error in the data file (for
  564.      example a duplicate key error), we try again, but this time we
  565.      re-create the data file.
  566.    * If the repair fails, retry once more with the old repair option
  567.      method (write row by row without sorting) which should be able to
  568.      repair any type of error with little disk requirements..
  569. If the recover wouldn't be able to recover all rows from a previous
  570. completed statement and you didn't specify `FORCE' as an option to
  571. `myisam-recover', then the automatic repair will abort with an error
  572. message in the error file:
  573.      Error: Couldn't repair table: test.g00pages
  574. If you in this case had used the `FORCE' option you would instead have
  575. got a warning in the error file:
  576.      Warning: Found 344 of 354 rows when repairing ./test/g00pages
  577. Note that if you run automatic recover with the `BACKUP' option, you
  578. should have a cron script that automaticly moves file with names like
  579. `tablename-datetime.BAK' from the database directories to a backup
  580. media.
  581. *Note Command-line options::.
  582. Space Needed for Keys
  583. ---------------------
  584. *MySQL* can support different index types, but the normal type is ISAM
  585. or MyISAM.  These use a B-tree index, and you can roughly calculate the
  586. size for the index file as `(key_length+4)/0.67', summed over all keys.
  587. (This is for the worst case when all keys are inserted in sorted order
  588. and we don't have any compressed keys.)
  589. String indexes are space compressed. If the first index part is a
  590. string, it will also be prefix compressed.  Space compression makes the
  591. index file smaller than the above figures if the string column has a lot
  592. of trailing space or is a `VARCHAR' column that is not always used to
  593. the full length. Prefix compression is used on keys that start with a
  594. string.  Prefix compression helps if there are many strings with an
  595. identical prefix.
  596. In `MyISAM' tables, you can also prefix compress numbers by specifying
  597. `PACK_KEYS=1' when you create the table.  This helps when you have many
  598. integer keys that have an identical prefix when the numbers are stored
  599. high-byte first.
  600. MyISAM Table Formats
  601. --------------------
  602. *MyISAM* supports 3 different table types. Two of them are chosen
  603. automatically depending on the type of columns you are using. The third,
  604. compressed tables, can only be created with the `myisampack' tool.
  605. Static (Fixed-length) Table Characteristics
  606. ...........................................
  607. This is the default format. It's used when the table contains no
  608. `VARCHAR', `BLOB', or `TEXT' columns.
  609. This format is the simplest and most secure format. It is also the
  610. fastest of the on-disk formats. The speed comes from the easy way data
  611. can be found on disk. When looking up something with an index and static
  612. format it is very simple. Just multiply the row number by the row
  613. length.
  614. Also, when scanning a table it is very easy to read a constant number of
  615. records with each disk read.
  616. The security is evidenced if your computer crashes when writing to a
  617. fixed-size MyISAM file, in which case `myisamchk' can easily figure out
  618. where each row starts and ends. So it can usually reclaim all records
  619. except the partially written one. Note that in *MySQL* all indexes can
  620. always be reconstructed:
  621.    * All `CHAR', `NUMERIC', and `DECIMAL' columns are space-padded to
  622.      the column width.
  623.    * Very quick.
  624.    * Easy to cache.
  625.    * Easy to reconstruct after a crash, because records are located in
  626.      fixed positions.
  627.    * Doesn't have to be reorganized (with `myisamchk') unless a huge
  628.      number of records are deleted and you want to return free disk
  629.      space to the operating system.
  630.    * Usually requires more disk space than dynamic tables.
  631. Dynamic Table Characteristics
  632. .............................
  633. This format is used if the table contains any `VARCHAR', `BLOB', or
  634. `TEXT' columns or if the table was created with `ROW_FORMAT=dynamic'.
  635. This format is a litte more complex because each row has to have a
  636. header that says how long it is. One record can also end up at more
  637. than one location when it is made longer at an update.
  638. You can use `OPTIMIZE table' or `myisamchk' to defragment a table. If
  639. you have static data that you access/change a lot in the same table as
  640. some `VARCHAR' or `BLOB' columns, it might be a good idea to move the
  641. dynamic columns to other tables just to avoid fragmentation:
  642.    * All string columns are dynamic (except those with a length less
  643.      than 4).
  644.    * Each record is preceded by a bitmap indicating which columns are
  645.      empty (`''') for string columns, or zero for numeric columns.
  646.      (This isn't the same as columns containing `NULL' values.) If a
  647.      string column has a length of zero after removal of trailing
  648.      spaces, or a numeric column has a value of zero, it is marked in
  649.      the bit map and not saved to disk.  Non-empty strings are saved as
  650.      a length byte plus the string contents.
  651.    * Usually takes much less disk space than fixed-length tables.
  652.    * Each record uses only as much space as is required. If a record
  653.      becomes larger, it is split into as many pieces as are required.
  654.      This results in record fragmentation.
  655.    * If you update a row with information that extends the row length,
  656.      the row will be fragmented.  In this case, you may have to run
  657.      `myisamchk -r' from time to time to get better performance.  Use
  658.      `myisamchk -ei tbl_name' for some statistics.
  659.    * Not as easy to reconstruct after a crash, because a record may be
  660.      fragmented into many pieces and a link (fragment) may be missing.
  661.    * The expected row length for dynamic sized records is:
  662.           3
  663.           + (number of columns + 7) / 8
  664.           + (number of char columns)
  665.           + packed size of numeric columns
  666.           + length of strings
  667.           + (number of NULL columns + 7) / 8
  668.      There is a penalty of 6 bytes for each link. A dynamic record is
  669.      linked whenever an update causes an enlargement of the record.
  670.      Each new link will be at least 20 bytes, so the next enlargement
  671.      will probably go in the same link.  If not, there will be another
  672.      link. You may check how many links there are with `myisamchk -ed'.
  673.      All links may be removed with `myisamchk -r'.
  674. Compressed Table Characteristics
  675. ................................
  676. This is a read-only type that is generated with the optional
  677. `myisampack' tool (`pack_isam' for `ISAM' tables):
  678.    * All MySQL distributions, even those that existed before *MySQL*
  679.      went GPL, can read tables that were compressed with `myisampack'.
  680.    * Compressed tables take very little disk space. This minimizes disk
  681.      usage, which is very nice when using slow disks (like CD-ROMs).
  682.    * Each record is compressed separately (very little access
  683.      overhead).  The header for a record is fixed (1-3 bytes) depending
  684.      on the biggest record in the table.  Each column is compressed
  685.      differently. Some of the compression types are:
  686.         - There is usually a different Huffman table for each column.
  687.         - Suffix space compression.
  688.         - Prefix space compression.
  689.         - Numbers with value `0' are stored using 1 bit.
  690.         - If values in an integer column have a small range, the column
  691.           is stored using the smallest possible type. For example, a
  692.           `BIGINT' column (8 bytes) may be stored as a `TINYINT' column
  693.           (1 byte) if all values are in the range `0' to `255'.
  694.         - If a column has only a small set of possible values, the
  695.           column type is converted to `ENUM'.
  696.         - A column may use a combination of the above compressions.
  697.    * Can handle fixed- or dynamic-length records, but not `BLOB' or
  698.      `TEXT' columns.
  699.    * Can be uncompressed with `myisamchk'.
  700. MERGE Tables
  701. ============
  702. `MERGE' tables are new in *MySQL* Version 3.23.25. The code is still in
  703. beta, but should stabilize soon!
  704. A `MERGE' table is a collection of identical `MyISAM' tables that can
  705. be used as one.  You can only `SELECT', `DELETE', and `UPDATE' from the
  706. collection of tables.  If you `DROP' the `MERGE' table, you are only
  707. dropping the `MERGE' specification.
  708. Note that `DELETE FROM merge_table' used without a `WHERE' will only
  709. clear the mapping for the table, not delete everything in the mapped
  710. tables. (We plan to fix this in 4.0).
  711. With identical tables we mean that all tables are created with identical
  712. column information.  You can't put a MERGE over tables where the columns
  713. are packed differently or doesn't have exactly the same columns.  Some
  714. of the tables can however be compressed with `myisampack'.  *Note
  715. myisampack::.
  716. When you create a `MERGE' table, you will get a `.frm' table definition
  717. file and a `.MRG' table list file.  The `.MRG' just contains a list of
  718. the index files (`.MYI' files) that should be used as one.
  719. For the moment you need to have `SELECT', `UPDATE', and `DELETE'
  720. privileges on the tables you map to a `MERGE' table.
  721. `MERGE' tables can help you solve the following problems:
  722.    * Easily manage a set of log tables. For example, you can put data
  723.      from different months into separate files, compress some of them
  724.      with `myisampack', and then create a `MERGE' to use these as one.
  725.    * Give you more speed. You can split a big read-only table based on
  726.      some criteria and then put the different table part on different
  727.      disks.  A `MERGE' table on this could be much faster than using
  728.      the big table. (You can, of course, also use a RAID to get the same
  729.      kind of benefits.)
  730.    * Do more efficient searches. If you know exactly what you are
  731.      looking after, you can search in just one of the split tables for
  732.      some queries and use *MERGE* table for others.  You can even have
  733.      many different `MERGE' tables active, with possible overlapping
  734.      files.
  735.    * More efficient repairs. It's easier to repair the individual files
  736.      that are mapped to a `MERGE' file than trying to repair a real big
  737.      file.
  738.    * Instant mapping of many files as one. A `MERGE' table uses the
  739.      index of the individual tables. It doesn't need an index of its
  740.      one.  This makes `MERGE' table collections VERY fast to make or
  741.      remap.
  742.    * If you have a set of tables that you join to a big table on demand
  743.      or batch, you should instead create a `MERGE' table on them on
  744.      demand.  This is much faster and will save a lot of disk space.
  745.    * Go around the file size limit for the operating system.
  746.    * You can create an alias/synonym for a table by just using MERGE
  747.      over one table. There shouldn't be any really notable performance
  748.      impacts of doing this (only a couple of indirect calls and
  749.      memcpy's for each read).
  750. The disadvantages with `MERGE' tables are:
  751.    * You can't use `INSERT' on `MERGE' tables, as *MySQL* can't know in
  752.      which of the tables we should insert the row.
  753.    * You can only use identical `MyISAM' tables for a `MERGE' table.
  754.    * `MERGE' tables uses more file descriptors. If you are using a
  755.      *MERGE* that maps over 10 tables and 10 users are using this, you
  756.      are using 10*10 + 10 file descriptors.  (10 data files for 10 users
  757.      and 10 shared index files.)
  758.    * Key reads are slower. When you do a read on a key, the `MERGE'
  759.      handler will need to issue a read on all underlying tables to check
  760.      which one most closely matches the given key.  If you then do a
  761.      'read-next' then the merge table handler will need to search the
  762.      read buffers to find the next key. Only when one key buffer is
  763.      used up, the handler will need to read the next key block. This
  764.      makes `MERGE' keys much slower on `eq_ref' searches, but not much
  765.      slower on `ref' searches.  *Note EXPLAIN::.
  766.    * You can't do `DROP TABLE', `ALTER TABLE' or `DELETE FROM
  767.      table_name' without a `WHERE' clause on any of the table that is
  768.      mapped by a `MERGE' table that is 'open'.  If you do this, the
  769.      `MERGE' table may still refer to the original table and you will
  770.      get unexpected results.
  771. The following example shows you how to use `MERGE' tables:
  772.      CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
  773.      CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
  774.      INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
  775.      INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
  776.      CREATE TABLE total (a INT NOT NULL, message CHAR(20), KEY(a)) TYPE=MERGE UNION=(t1,t2);
  777. Note that we didn't create a `UNIQUE' or `PRIMARY KEY' in the `total'
  778. table as the key isn't going to be unique in the `total' table.
  779. Note that you can also manipulate the `.MRG' file directly from the
  780. outside of the *MySQL* server:
  781.      shell> cd /mysql-data-directory/current-database
  782.      shell> ls -1 t1.MYI t2.MYI > total.MRG
  783.      shell> mysqladmin flush-tables
  784. Now you can do things like:
  785.      mysql> select * from total;
  786.      +---+---------+
  787.      | a | message |
  788.      +---+---------+
  789.      | 1 | Testing |
  790.      | 2 | table   |
  791.      | 3 | t1      |
  792.      | 1 | Testing |
  793.      | 2 | table   |
  794.      | 3 | t2      |
  795.      +---+---------+
  796. To remap a `MERGE' table you can do one of the following:
  797.    * `DROP' the table and re-create it
  798.    * Use `ALTER TABLE table_name UNION(...)'
  799.    * Change the `.MRG' file and issue a `FLUSH TABLE' on the `MERGE'
  800.      table and all underlying tables to force the handler to read the
  801.      new definition file.
  802. ISAM Tables
  803. ===========
  804. You can also use the deprecated ISAM table type. This will disappear
  805. rather soon because `MyISAM' is a better implementation of the same
  806. thing. ISAM uses a `B-tree' index. The index is stored in a file with
  807. the `.ISM' extension, and the data is stored in a file with the `.ISD'
  808. extension.  You can check/repair ISAM tables with the `isamchk'
  809. utility. *Note Crash recovery::.
  810. `ISAM' has the following features/properties:
  811.    * Compressed and fixed-length keys
  812.    * Fixed and dynamic record length
  813.    * 16 keys with 16 key parts/key
  814.    * Max key length 256 (default)
  815.    * Data is stored in machine format; this is fast, but is machine/OS
  816.      dependent.
  817. Most of the things true for `MyISAM' tables are also true for `ISAM'
  818. tables. *Note MyISAM::. The major differences compared to `MyISAM'
  819. tables are:
  820.    * ISAM tables are not binary portable across OS/Platforms.
  821.    * Can't handle tables > 4G.
  822.    * Only support prefix compression on strings.
  823.    * Smaller key limits.
  824.    * Dynamic tables get more fragmented.
  825.    * Tables are compressed with `pack_isam' rather than with
  826.      `myisampack'.
  827. HEAP Tables
  828. ===========
  829. `HEAP' tables use a hashed index and are stored in memory.  This makes
  830. them very fast, but if *MySQL* crashes you will lose all data stored in
  831. them.  `HEAP' is very useful for temporary tables!
  832. The *MySQL* internal HEAP tables use 100% dynamic hashing without
  833. overflow areas. There is no extra space needed for free lists.  `HEAP'
  834. tables also don't have problems with delete + inserts, which normally
  835. is common with hashed tables:
  836.      mysql> CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
  837.              FROM log_table GROUP BY ip;
  838.      mysql> SELECT COUNT(ip),AVG(down) FROM test;
  839.      mysql> DROP TABLE test;
  840. Here are some things you should consider when you use `HEAP' tables:
  841.    * You should always use specify `MAX_ROWS' in the `CREATE' statement
  842.      to ensure that you accidently do not use all memory.
  843.    * Indexes will only be used with `=' and `<=>' (but are VERY fast).
  844.    * `HEAP' tables can only use whole keys to search for a row; compare
  845.      this to `MyISAM' tables where any prefix of the key can be used to
  846.      find rows.
  847.    * `HEAP' tables use a fixed record length format.
  848.    * `HEAP' doesn't support `BLOB'/`TEXT' columns.
  849.    * `HEAP' doesn't support `AUTO_INCREMENT' columns.
  850.    * `HEAP' doesn't support an index on a `NULL' column.
  851.    * You can have non-unique keys in a `HEAP' table (this isn't common
  852.      for hashed tables).
  853.    * `HEAP' tables are shared between all clients (just like any other
  854.      table).
  855.    * You can't search for the next entry in order (that is, to use the
  856.      index to do an `ORDER BY').
  857.    * Data for `HEAP' tables are allocated in small blocks. The tables
  858.      are 100% dynamic (on inserting). No overflow areas and no extra key
  859.      space are needed.  Deleted rows are put in a linked list and are
  860.      reused when you insert new data into the table.
  861.    * You need enough extra memory for all HEAP tables that you want to
  862.      use at the same time.
  863.    * To free memory, you should execute `DELETE FROM heap_table',
  864.      `TRUNCATE heap_table' or `DROP TABLE heap_table'.
  865.    * *MySQL* cannot find out approximately how many rows there are
  866.      between two values (this is used by the range optimizer to decide
  867.      which index to use).  This may affect some queries if you change a
  868.      `MyISAM' table to a `HEAP' table.
  869.    * To ensure that you accidentally don't do anything foolish, you
  870.      can't create `HEAP' tables bigger than `max_heap_table_size'.
  871. The memory needed for one row in a `HEAP' table is:
  872.      SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2)
  873.      + ALIGN(length_of_row+1, sizeof(char*))
  874. `sizeof(char*)' is 4 on 32-bit machines and 8 on 64-bit machines.
  875. BDB or Berkeley_db Tables
  876. =========================
  877. Overview over BDB tables
  878. ------------------------
  879. BDB tables are included in the *MySQL* source distribution starting
  880. from 3.23.34 and will be activated in the *MySQL*-max binary.
  881. Berkeley DB (`http://www.sleepycat.com') has provided *MySQL* with a
  882. transaction-safe table handler. This will survive crashes and also
  883. provides `COMMIT' and `ROLLBACK' on transactions. The *MySQL* source
  884. distribution comes with a BDB distribution that has a couple of small
  885. patches to make it work more smoothly with *MySQL*.  You can't use a
  886. not-patched `BDB' version with *MySQL*.
  887. Installing BDB
  888. --------------
  889. If you have downloaded a binary version of *MySQL* that includes
  890. support for Berkeley DB, simply follow the instructions for installing
  891. a binary version of *MySQL*. *Note Installing binary::.
  892. To compile MySQL with Berkeley DB support, download *MySQL* 3.23.34 or
  893. newer and configure `MySQL' with the `--with-berkeley-db' option. *Note
  894. Installing source::.
  895.      cd /path/to/source/of/mysql-3.23.34
  896.      ./configure --with-berkeley-db
  897. Please refer to the manual provided by `BDB' distribution for
  898. more/updated information.
  899. Even though Berkeley DB is in itself very tested and reliable, the
  900. *MySQL* interface is still considered beta quality.  We are actively
  901. improving and optimizing it to get it stable very soon.
  902. BDB startup options
  903. -------------------
  904. If you are running with `AUTOCOMMIT=0' then your changes in `BDB'
  905. tables will not be updated until you execute `COMMIT'.  Instead of
  906. commit you can execute `ROLLBACK' to forget your changes. *Note
  907. COMMIT::.
  908. If you are running with `AUTOCOMMIT=1' (the default), your changes will
  909. be committed immediately.  You can start an extended transaction with
  910. the `BEGIN WORK' SQL command, after which your changes will not be
  911. committed until you execute `COMMIT' (or decide to `ROLLBACK' the
  912. changes).
  913. The following options to `mysqld' can be used to change the behavior of
  914. BDB tables:
  915. *Option*               *Meaning*
  916. `--bdb-home=directory' Base directory for BDB tables. This should be the
  917.                        same directory you use for -datadir.
  918. `--bdb-lock-detect=#'  Berkeley lock detect. One of (DEFAULT, OLDEST,
  919.                        RANDOM, or YOUNGEST).
  920. `--bdb-logdir=directory'Berkeley DB log file directory.
  921. `--bdb-no-sync'        Don't synchronously flush logs.
  922. `--bdb-no-recover'     Don't start Berkeley DB in recover mode.
  923. `--bdb-shared-data'    Start Berkeley DB in multi-process mode (Don't
  924.                        use `DB_PRIVATE' when initializing Berkeley DB)
  925. `--bdb-tmpdir=directory'Berkeley DB tempfile name.
  926. `--skip-bdb'           Don't use berkeley db.
  927. `-O                    Set the maximum number of locks possible. *Note
  928. bdb_max_lock=1000'     SHOW VARIABLES::.
  929. If you use `--skip-bdb', *MySQL* will not initialize the Berkeley DB
  930. library and this will save a lot of memory. Of course, you cannot use
  931. `BDB' tables if you are using this option.
  932. Normally you should start mysqld without `--bdb-no-recover' if you
  933. intend to use BDB tables.  This may, however, give you problems when you
  934. try to start mysqld if the BDB log files are corrupted. *Note Starting
  935. server::.
  936. With `bdb_max_lock' you can specify the maximum number of locks (10000
  937. by default) you can have active on a BDB table. You should increase
  938. this if you get errors of type `bdb: Lock table is out of available
  939. locks' or `Got error 12 from ...'  when you have do long transactions
  940. or when `mysqld' has to examine a lot of rows to calculate the query.
  941. You may also want to change `binlog_cache_size' and
  942. `max_binlog_cache_size' if you are using big multi-line transactions.
  943. *Note COMMIT::.
  944. Some characteristic of `BDB' tables:
  945. ------------------------------------
  946.    * To be able to rollback transactions BDB maintain log files.  For
  947.      maximum performance you should place these on another disk than
  948.      your databases by using the `--bdb_log_dir' options.
  949.    * *MySQL* performs a checkpoint each time a new BDB log file is
  950.      started, and removes any log files that are not needed for current
  951.      transactions.  One can also run `FLUSH LOGS' at any time to
  952.      checkpoint the Berkeley DB tables.
  953.      For disaster recovery, one should use table backups plus *MySQL*'s
  954.      binary log. *Note Backup::.
  955.      *Warning*: If you delete old log files that are in use, BDB will
  956.      not be able to do recovery at all and you may loose data if
  957.      something goes wrong.
  958.    * *MySQL* requires a `PRIMARY KEY' in each BDB table to be able to
  959.      refer to previously read rows. If you don't create one, *MySQL*
  960.      will create an maintain a hidden `PRIMARY KEY' for you.  The
  961.      hidden key has a length of 5 bytes and is incremented for each
  962.      insert attempt.
  963.    * If all columns you access in a `BDB' table are part of the same
  964.      index or part of the primary key, then *MySQL* can execute the
  965.      query without having to access the actual row.  In a `MyISAM'
  966.      table the above holds only if the columns are part of the same
  967.      index.
  968.    * The `PRIMARY KEY' will be faster than any other key, as the
  969.      `PRIMARY KEY' is stored together with the row data.  As the other
  970.      keys are stored as the key data + the `PRIMARY KEY', it's
  971.      important to keep the `PRIMARY KEY' as short as possible to save
  972.      disk and get better speed.
  973.    * `LOCK TABLES' works on `BDB' tables as with other tables.  If you
  974.      don't use `LOCK TABLE', *MYSQL* will issue an internal
  975.      multiple-write lock on the table to ensure that the table will be
  976.      properly locked if another thread issues a table lock.
  977.    * Internal locking in `BDB' tables is done on page level.
  978.    * `SELECT COUNT(*) FROM table_name' is slow as `BDB' tables doesn't
  979.      maintain a count of the number of rows in the table.
  980.    * Scanning is slower than with `MyISAM' tables as one has data in BDB
  981.      tables stored in B-trees and not in a separate data file.
  982.    * The application must always be prepared to handle cases where any
  983.      change of a `BDB' table may make an automatic rollback and any
  984.      read may fail with a deadlock error.
  985.    * Keys are not compressed to previous keys as with ISAM or MyISAM
  986.      tables. In other words, the key information will take a little more
  987.      space in `BDB' tables compared to MyISAM tables which don't use
  988.      `PACK_KEYS=0'.
  989.    * There is often holes in the BDB table to allow you to insert new
  990.      rows in the middle of the key tree.  This makes BDB tables
  991.      somewhat larger than MyISAM tables.
  992.    * The optimizer needs to know an approximation of the number of rows
  993.      in the table.  *MySQL* solves this by counting inserts and
  994.      maintaining this in a separate segment in each BDB table.  If you
  995.      don't do a lot of `DELETE' or `ROLLBACK':s this number should be
  996.      accurate enough for the *MySQL* optimizer, but as *MySQL* only
  997.      store the number on close, it may be wrong if *MySQL* dies
  998.      unexpectedly. It should not be fatal even if this number is not
  999.      100 % correct.  One can update the number of rows by executing
  1000.      `ANALYZE TABLE' or `OPTIMIZE TABLE'. *Note ANALYZE TABLE:: . *Note
  1001.      OPTIMIZE TABLE::.
  1002.    * If you get full disk with a `BDB' table, you will get an error
  1003.      (probably error 28) and the transaction should roll back.  This is
  1004.      in contrast with `MyISAM' and `ISAM' tables where mysqld will wait
  1005.      for enough free disk before continuing.
  1006. Some things we need to fix for BDB in the near future:
  1007. ------------------------------------------------------
  1008.    * It's very slow to open many BDB tables at the same time. If you are
  1009.      going to use BDB tables, you should not have a very big table
  1010.      cache (> 256 ?) and you should use `--no-auto-rehash' with the
  1011.      `mysql' client.  We plan to partly fix this in 4.0.
  1012.    * `SHOW TABLE STATUS' doesn't yet provide that much information for
  1013.      BDB tables.
  1014.    * Optimize performance.
  1015.    * Change to not use page locks at all when we are scanning tables.
  1016. Errors You May Get When Using BDB Tables
  1017. ----------------------------------------
  1018.    * If you get the following error in the `hostname.err log' when
  1019.      starting `mysqld':
  1020.           bdb:  Ignoring log file: .../log.XXXXXXXXXX: unsupported log version #
  1021.      it means that the new `BDB' version doesn't support the old log
  1022.      file format.  In this case you have to delete all `BDB' log BDB
  1023.      from your database directory (the files that has the format
  1024.      `log.XXXXXXXXXX' ) and restart `mysqld'.  We would also recommend
  1025.      you to do a `mysqldump --opt' of your old `BDB' tables, delete the
  1026.      old table and restore the dump.
  1027.    * If you are running in not `auto_commit' mode and delete a table you
  1028.      are using by another thread you may get the following error
  1029.      messages in the *MySQL* error file:
  1030.           001119 23:43:56  bdb:  Missing log fileid entry
  1031.           001119 23:43:56  bdb:  txn_abort: Log undo failed for LSN: 1 3644744: Invalid
  1032.      This is not fatal but we don't recommend that you delete tables if
  1033.      you are not in `auto_commit' mode, until this problem is fixed
  1034.      (the fix is not trivial).
  1035. GEMINI Tables
  1036. =============
  1037. Overview of GEMINI tables
  1038. -------------------------
  1039. The `GEMINI' table type is developed and supported by NuSphere
  1040. Corporation (`http://www.nusphere.com').  It features row-level
  1041. locking, transaction support (`COMMIT' and `ROLLBACK'), and automatic
  1042. crash recovery.
  1043. `GEMINI' tables will be included in the *MySQL* 3.23.35 source
  1044. distribution.
  1045. GEMINI startup options
  1046. ----------------------
  1047. If you are running with `AUTOCOMMIT=0' then your changes in `GEMINI'
  1048. tables will not be updated until you execute `COMMIT'.  Instead of
  1049. commit you can execute `ROLLBACK' to forget your changes. *Note
  1050. COMMIT::.
  1051. If you are running with `AUTOCOMMIT=1' (the default), your changes will
  1052. be committed immediately.  You can start an extended transaction with
  1053. the `BEGIN WORK' SQL command, after which your changes will not be
  1054. committed until you execute `COMMIT' (or decide to `ROLLBACK' the
  1055. changes).
  1056. The following options to `mysqld' can be used to change the behavior of
  1057. GEMINI tables:
  1058. *Option*               *Meaning*
  1059. `--gemini-full-recovery'Default.
  1060. `--gemini-no-recovery' Turn off recovery logging.  Not recommended.
  1061. `--gemini-lazy-commit' Relaxes the flush log at commit rule.
  1062. `--gemini-unbuffered-io'All database writes bypass OS cache.
  1063. `--skip-gemini'        Don't use Gemini.
  1064. `--O                   Number of database buffers in database cache.
  1065. gemini_db_buffers=#'   
  1066. `--O                   Maximum number of connections to Gemini.
  1067. gemini_connection_limit=#'
  1068. `--O                   Spin lock retries (optimization).
  1069. gemini_spin_retries=#' 
  1070. `--O                   Number of background I/O threads.
  1071. gemini_io_threads=#'   
  1072. `--O                   Set the maximum number of locks.  Default 4096.
  1073. gemini_lock_table_size=#'
  1074. If you use `--skip-gemini', *MySQL* will not initialize the Gemini
  1075. table handler, saving memory; you cannot use Gemini tables if you use
  1076. `--skip-gemini'.
  1077. Features of `GEMINI' tables:
  1078. ----------------------------
  1079.    * If a query result can be resolved solely from the index key,
  1080.      Gemini will not read the actual row stored in the database.
  1081.    * Locking on Gemini tables is done at row level.
  1082.    * `SELECT COUNT(*) FROM table_name' is fast; Gemini maintains a count
  1083.      of the number of rows in the table.
  1084. Current limitations of `GEMINI' tables:
  1085. ---------------------------------------
  1086.    * BLOB columns are not supported in `GEMINI' tables.
  1087.    * The maximum number of concurrent users accessing `GEMINI' tables is
  1088.      limited by `gemini_connection_limit'.  The default is 100 users.
  1089. NuSphere is working on removing these limitations.
  1090. INNOBASE Tables
  1091. ===============
  1092. INNOBASE Tables overview
  1093. ------------------------
  1094. Innobase tables are included in the *MySQL* source distribution
  1095. starting from 3.23.34 and will be activated in the *MySQL*-max binary.
  1096. If you have downloaded a binary version of *MySQL* that includes
  1097. support for Innobase, simply follow the instructions for installing a
  1098. binary version of *MySQL*. *Note Installing binary::.
  1099. To compile *MySQL* with Innobase support, download *MySQL* 3.23.34 or
  1100. newer and configure `MySQL' with the `--with-innobase' option. *Note
  1101. Installing source::.
  1102.      cd /path/to/source/of/mysql-3.23.34
  1103.      ./configure --with-innobase
  1104. Innobase provides MySQL with a transaction safe table handler with
  1105. commit, rollback, and crash recovery capabilities.  Innobase does
  1106. locking on row level, and also provides an Oracle-style consistent
  1107. non-locking read in `SELECTS', which increases transaction concurrency.
  1108. There is neither need for lock escalation in Innobase, because row
  1109. level locks in Innobase fit in very small space.
  1110. Innobase is a table handler that is under the GNU GPL License Version 2
  1111. (of June 1991). In the source distribution of MySQL, Innobase appears as
  1112. a subdirectory.
  1113. INNOBASE startup options
  1114. ------------------------
  1115. To use Innobase tables you must specify configuration parameters in the
  1116. MySQL configuration file in the `[mysqld]' section of the configuration
  1117. file. Below is an example of possible configuration parameters in
  1118. my.cnf for Innobase:
  1119.      innobase_data_home_dir = c:ibdata
  1120.      innobase_data_file_path = ibdata1:25M;ibdata2:37M;ibdata3:100M;ibdata4:300M
  1121.      set-variable = innobase_mirrored_log_groups=1
  1122.      innobase_log_group_home_dir = c:iblogs
  1123.      set-variable = innobase_log_files_in_group=3
  1124.      set-variable = innobase_log_file_size=5M
  1125.      set-variable = innobase_log_buffer_size=8M
  1126.      innobase_flush_log_at_trx_commit=1
  1127.      innobase_log_arch_dir = c:iblogs
  1128.      innobase_log_archive=0
  1129.      set-variable = innobase_buffer_pool_size=16M
  1130.      set-variable = innobase_additional_mem_pool_size=2M
  1131.      set-variable = innobase_file_io_threads=4
  1132.      set-variable = innobase_lock_wait_timeout=50
  1133. The meanings of the configuration parameters are the following:
  1134. `innobase_data_home_dir' The common part of the directory path for all
  1135.                        innobase data files.
  1136. `innobase_data_file_path' Paths to individual data files and their sizes.
  1137.                        The full directory path to each data file is
  1138.                        acquired by concatenating innobase_data_home_dir
  1139.                        to the paths specified here. The file sizes are
  1140.                        specified in megabytes, hence the 'M' after the
  1141.                        size specification above. Do not set a file size
  1142.                        bigger than 4000M, and on most operating systems
  1143.                        not bigger than 2000M.
  1144.                        innobase_mirrored_log_groups Number of identical
  1145.                        copies of log groups we keep for the database.
  1146.                        Currently this should be set to 1.
  1147. `innobase_log_group_home_dir' Directory path to Innobase log files.
  1148. `innobase_log_files_in_group' Number of log files in the log group. Innobase
  1149.                        writes to the files in a circular fashion.  Value
  1150.                        3 is recommended here.
  1151. `innobase_log_file_size' Size of each log file in a log group in
  1152.                        megabytes. Sensible values range from 1M to the
  1153.                        size of the buffer pool specified below. The
  1154.                        bigger the value, the less checkpoint flush
  1155.                        activity is needed in the buffer pool, saving
  1156.                        disk i/o. But bigger log files also mean that
  1157.                        recovery will be slower in case of a crash. File
  1158.                        size restriction as for a data file.
  1159. `innobase_log_buffer_size' The size of the buffer which Innobase uses to
  1160.                        write log to the log files on disk.  Sensible
  1161.                        values range from 1M to half the combined size of
  1162.                        log files. A big log buffer allows large
  1163.                        transactions to run without a need to write the
  1164.                        log to disk until the transaction commit. Thus,
  1165.                        if you have big transactions, making the log
  1166.                        buffer big will save disk i/o.
  1167. `innobase_flush_log_at_trx_commit' Normally this is set to 1, meaning that at a
  1168.                        transaction commit the log is flushed to disk,
  1169.                        and the modifications made by the transaction
  1170.                        become permanent, and survive a database crash.
  1171.                        If you are willing to compromise this safety, and
  1172.                        you are running small transactions, you may set
  1173.                        this to 0 to reduce disk i/o to the logs.
  1174. `innobase_log_arch_dir' The directory where fully written log files
  1175.                        would be archived if we used log archiving.  The
  1176.                        value of this parameter should currently be set
  1177.                        the same as `innobase_log_group_home_dir'.
  1178. `innobase_log_archive'  This value should currently be set to 0.  As
  1179.                        recovery from a backup is done by MySQL using its
  1180.                        own log files, there is currently no need to
  1181.                        archive Innobase log files.
  1182. `innobase_buffer_pool_size' The size of the memory buffer Innobase uses to
  1183.                        cache data and indexes of its tables.  The bigger
  1184.                        you set this the less disk i/o is needed to
  1185.                        access data in tables. On a dedicated database
  1186.                        server you may set this parameter up to 90 % of
  1187.                        the machine physical memory size. Do not set it
  1188.                        too large, though, because competition of the
  1189.                        physical memory may cause paging in the operating
  1190.                        system.
  1191. `innobase_additional_mem_pool_size' Size of a memory pool Innobase uses to store
  1192.                        data dictionary information and other internal
  1193.                        data structures. A sensible value for this might
  1194.                        be 2M, but the more tables you have in your
  1195.                        application the more you will need to allocate
  1196.                        here. If Innobase runs out of memory in this
  1197.                        pool, it will start to allocate memory from the
  1198.                        operating system, and write warning messages to
  1199.                        the MySQL error log.
  1200. `innobase_file_io_threads' Number of file i/o threads in Innobase.
  1201.                        Normally, this should be 4, but on Windows NT
  1202.                        disk i/o may benefit from a larger number.
  1203. `innobase_lock_wait_timeout' Timeout in seconds an Innobase transaction may
  1204.                        wait for a lock before being rolled back.
  1205.                        Innobase automatically detects transaction
  1206.                        deadlocks in its own lock table and rolls back
  1207.                        the transaction. If you use `LOCK TABLES'
  1208.                        command, or other transaction safe table handlers
  1209.                        than Innobase in the same transaction, then a
  1210.                        deadlock may arise which Innobase cannot notice.
  1211.                        In cases like this the timeout is useful to
  1212.                        resolve the situation.
  1213. Using INNOBASE tables
  1214. ---------------------
  1215. Technically, Innobase is a database backend placed under MySQL. Innobase
  1216. has its own buffer pool for caching data and indexes in main memory.
  1217. Innobase stores its tables and indexes in a tablespace, which may
  1218. consist of several files. This is different from, for example, `MyISAM'
  1219. tables where each table is stored as a separate file.
  1220. To create a table in the Innobase format you must specify `TYPE =
  1221. INNOBASE' in the table creation SQL command:
  1222.      CREATE TABLE CUSTOMERS (A INT, B CHAR (20), INDEX (A)) TYPE = INNOBASE;
  1223. A consistent non-locking read is the default locking behavior when you
  1224. do a `SELECT' from an Innobase table. For a searched update and an
  1225. insert row level exclusive locking is performed.
  1226. You can query the amount of free space in the Innobase tablespace (=
  1227. data files you specified in my.cnf) by issuing the table status command
  1228. of *MySQL* for any table you have created with `TYPE = INNOBASE'.  Then
  1229. the amount of free space in the tablespace appears in the table comment
  1230. section in the output of SHOW. An example:
  1231.      SHOW TABLE STATUS FROM TEST LIKE 'CUSTOMER'
  1232. if you have created a table of name CUSTOMER in a database you have
  1233. named TEST. Note that the statistics SHOW gives about Innobase tables
  1234. are only approximate: they are used in SQL optimization. Table and
  1235. index reserved sizes in bytes are accurate, though.
  1236. NOTE: DROP DATABASE does not currently work for Innobase tables!  You
  1237. must drop the tables individually.
  1238. Note that in addition to your tables, the rollback segment uses space
  1239. from the tablespace.
  1240. Since Innobase is a multiversioned database, it must keep information
  1241. of old versions of rows in the tablespace. This information is stored
  1242. in a data structure called a rollback segment, like in Oracle. In
  1243. contrast to Oracle, you do not need to configure the rollback segment
  1244. in any way in Innobase. If you issue SELECTs, which by default do a
  1245. consistent read in Innobase, remember to commit your transaction
  1246. regularly. Otherwise the rollback segment will grow because it has to
  1247. preserve the information needed for further consistent reads in your
  1248. transaction: in Innobase all consistent reads within one transaction
  1249. will see the same timepoint snapshot of the database: the reads are
  1250. also 'consistent' with respect to each other.
  1251. Some Innobase errors: If you run out of file space in the tablespace,
  1252. you will get the MySQL 'Table is full' error. If you want to make your
  1253. tablespace bigger, you have to shut down MySQL and add a new datafile
  1254. specification to my.conf, to the innobase_data_file_path parameter.
  1255. A transaction deadlock or a timeout in a lock wait will give 'Table
  1256. handler error 1000000'.
  1257. Contact information of Innobase Oy, producer of the Innobase engine:
  1258. Website: `http://www.innobase.fi'.
  1259. <Heikki.Tuuri@innobase.inet.fi>
  1260.      phone: 358-9-6969 3250 (office) 358-40-5617367 (mobile)
  1261.      Innobase Oy Inc.
  1262.      World Trade Center Helsinki
  1263.      Aleksanterinkatu 17
  1264.      P.O.Box 800
  1265.      00101 Helsinki
  1266.      Finland
  1267. Some restrictions on `INNOBASE' tables:
  1268. ---------------------------------------
  1269.    * You can't have a key on a `BLOB' or `TEXT' column.
  1270.    * `DELETE FROM TABLE' doesn't re-generate the table but instead
  1271.      deletes all rows, one by one, which isn't that fast.
  1272.    * The maximum blob size is 8000 bytes.
  1273.    * Before dropping a database with `INNOBASE' tables one has to drop
  1274.      the individual tables first.  If one doesn't do that, the space in
  1275.      the Innobase table space will not be reclaimed.
  1276. MySQL Tutorial
  1277. **************
  1278. This chapter provides a tutorial introduction to *MySQL* by showing how
  1279. to use the `mysql' client program to create and use a simple database.
  1280. `mysql' (sometimes referred to as the "terminal monitor" or just
  1281. "monitor") is an interactive program that allows you to connect to a
  1282. *MySQL* server, run queries, and view the results.  `mysql' may also be
  1283. used in batch mode: you place your queries in a file beforehand, then
  1284. tell `mysql' to execute the contents of the file.  Both ways of using
  1285. `mysql' are covered here.
  1286. To see a list of options provided by `mysql', invoke it with the
  1287. `--help' option:
  1288.      shell> mysql --help
  1289. This chapter assumes that `mysql' is installed on your machine and that
  1290. a *MySQL* server is available to which you can connect.  If this is not
  1291. true, contact your *MySQL* administrator.  (If _you_ are the
  1292. administrator, you will need to consult other sections of this manual.)
  1293. This chapter describes the entire process of setting up and using a
  1294. database.  If you are interested only in accessing an already-existing
  1295. database, you may want to skip over the sections that describe how to
  1296. create the database and the tables it contains.
  1297. Because this chapter is tutorial in nature, many details are
  1298. necessarily left out.  Consult the relevant sections of the manual for
  1299. more information on the topics covered here.
  1300. Connecting to and Disconnecting from the Server
  1301. ===============================================
  1302. To connect to the server, you'll usually need to provide a *MySQL* user
  1303. name when you invoke `mysql' and, most likely, a password.  If the
  1304. server runs on a machine other than the one where you log in, you'll
  1305. also need to specify a hostname.  Contact your administrator to find
  1306. out what connection parameters you should use to connect (that is, what
  1307. host, user name, and password to use).  Once you know the proper
  1308. parameters, you should be able to connect like this:
  1309.      shell> mysql -h host -u user -p
  1310.      Enter password: ********
  1311. The `********' represents your password; enter it when `mysql' displays
  1312. the `Enter password:' prompt.
  1313. If that works, you should see some introductory information followed by
  1314. a `mysql>' prompt:
  1315.      shell> mysql -h host -u user -p
  1316.      Enter password: ********
  1317.      Welcome to the MySQL monitor.  Commands end with ; or g.
  1318.      Your MySQL connection id is 459 to server version: 3.22.20a-log
  1319.      
  1320.      Type 'help' for help.
  1321.      
  1322.      mysql>
  1323. The prompt tells you that `mysql' is ready for you to enter commands.
  1324. Some *MySQL* installations allow users to connect as the anonymous
  1325. (unnamed) user to the server running on the local host.  If this is the
  1326. case on your machine, you should be able to connect to that server by
  1327. invoking `mysql' without any options:
  1328.      shell> mysql
  1329. After you have connected successfully, you can disconnect any time by
  1330. typing `QUIT' at the `mysql>' prompt:
  1331.      mysql> QUIT
  1332.      Bye
  1333. You can also disconnect by pressing Control-D.
  1334. Most examples in the following sections assume you are connected to the
  1335. server.  They indicate this by the `mysql>' prompt.
  1336. Entering Queries
  1337. ================
  1338. Make sure you are connected to the server, as discussed in the previous
  1339. section.  Doing so will not in itself select any database to work with,
  1340. but that's okay.  At this point, it's more important to find out a
  1341. little about how to issue queries than to jump right in creating
  1342. tables, loading data into them, and retrieving data from them.  This
  1343. section describes the basic principles of entering commands, using
  1344. several queries you can try out to familiarize yourself with how
  1345. `mysql' works.
  1346. Here's a simple command that asks the server to tell you its version
  1347. number and the current date.  Type it in as shown below following the
  1348. `mysql>' prompt and hit the RETURN key:
  1349.      mysql> SELECT VERSION(), CURRENT_DATE;
  1350.      +--------------+--------------+
  1351.      | version()    | CURRENT_DATE |
  1352.      +--------------+--------------+
  1353.      | 3.22.20a-log | 1999-03-19   |
  1354.      +--------------+--------------+
  1355.      1 row in set (0.01 sec)
  1356.      mysql>
  1357. This query illustrates several things about `mysql':
  1358.    * A command normally consists of a SQL statement followed by a
  1359.      semicolon.  (There are some exceptions where a semicolon is not
  1360.      needed.  `QUIT', mentioned earlier, is one of them.  We'll get to
  1361.      others later.)
  1362.    * When you issue a command, `mysql' sends it to the server for
  1363.      execution and displays the results, then prints another `mysql>'
  1364.      to indicate that it is ready for another command.
  1365.    * `mysql' displays query output as a table (rows and columns).  The
  1366.      first row contains labels for the columns.  The rows following are
  1367.      the query results.  Normally, column labels are the names of the
  1368.      columns you fetch from database tables.  If you're retrieving the
  1369.      value of an expression rather than a table column (as in the
  1370.      example just shown), `mysql' labels the column using the
  1371.      expression itself.
  1372.    * `mysql' shows how many rows were returned and how long the query
  1373.      took to execute, which gives you a rough idea of server
  1374.      performance.  These values are imprecise because they represent
  1375.      wall clock time (not CPU or machine time), and because they are
  1376.      affected by factors such as server load and network latency.  (For
  1377.      brevity, the "rows in set" line is not shown in the remaining
  1378.      examples in this chapter.)
  1379. Keywords may be entered in any lettercase.  The following queries are
  1380. equivalent:
  1381.      mysql> SELECT VERSION(), CURRENT_DATE;
  1382.      mysql> select version(), current_date;
  1383.      mysql> SeLeCt vErSiOn(), current_DATE;
  1384. Here's another query.  It demonstrates that you can use `mysql' as a
  1385. simple calculator:
  1386.      mysql> SELECT SIN(PI()/4), (4+1)*5;
  1387.      +-------------+---------+
  1388.      | SIN(PI()/4) | (4+1)*5 |
  1389.      +-------------+---------+
  1390.      |    0.707107 |      25 |
  1391.      +-------------+---------+
  1392. The commands shown thus far have been relatively short, single-line
  1393. statements.  You can even enter multiple statements on a single line.
  1394. Just end each one with a semicolon:
  1395.      mysql> SELECT VERSION(); SELECT NOW();
  1396.      +--------------+
  1397.      | version()    |
  1398.      +--------------+
  1399.      | 3.22.20a-log |
  1400.      +--------------+
  1401.      
  1402.      +---------------------+
  1403.      | NOW()               |
  1404.      +---------------------+
  1405.      | 1999-03-19 00:15:33 |
  1406.      +---------------------+
  1407. A command need not be given all on a single line, so lengthy commands
  1408. that require several lines are not a problem.  `mysql' determines where
  1409. your statement ends by looking for the terminating semicolon, not by
  1410. looking for the end of the input line.  (In other words, `mysql'
  1411. accepts free-format input:  it collects input lines but does not
  1412. execute them until it sees the semicolon.)
  1413. Here's a simple multiple-line statement:
  1414.      mysql> SELECT
  1415.          -> USER()
  1416.          -> ,
  1417.          -> CURRENT_DATE;
  1418.      +--------------------+--------------+
  1419.      | USER()             | CURRENT_DATE |
  1420.      +--------------------+--------------+
  1421.      | joesmith@localhost | 1999-03-18   |
  1422.      +--------------------+--------------+
  1423. In this example, notice how the prompt changes from `mysql>' to `->'
  1424. after you enter the first line of a multiple-line query.  This is how
  1425. `mysql' indicates that it hasn't seen a complete statement and is
  1426. waiting for the rest.  The prompt is your friend, because it provides
  1427. valuable feedback.  If you use that feedback, you will always be aware
  1428. of what `mysql' is waiting for.
  1429. If you decide you don't want to execute a command that you are in the
  1430. process of entering, cancel it by typing `c':
  1431.      mysql> SELECT
  1432.          -> USER()
  1433.          -> c
  1434.      mysql>
  1435. Here, too, notice the prompt.  It switches back to `mysql>' after you
  1436. type `c', providing feedback to indicate that `mysql' is ready for a
  1437. new command.
  1438. The following table shows each of the prompts you may see and
  1439. summarizes what they mean about the state that `mysql' is in:
  1440. *Prompt**Meaning*
  1441. `mysql>'Ready for new command.
  1442. `       Waiting for next line of multiple-line command.
  1443. ->'     
  1444. `       Waiting for next line, collecting a string that begins with a
  1445. '>'     single quote (`'').
  1446. `       Waiting for next line, collecting a string that begins with a
  1447. ">'     double quote (`"').
  1448. Multiple-line statements commonly occur by accident when you intend to
  1449. issue a command on a single line, but forget the terminating semicolon.
  1450. In this case, `mysql' waits for more input:
  1451.      mysql> SELECT USER()
  1452.          ->
  1453. If this happens to you (you think you've entered a statement but the
  1454. only response is a `->' prompt), most likely `mysql' is waiting for the
  1455. semicolon.  If you don't notice what the prompt is telling you, you
  1456. might sit there for a while before realizing what you need to do.
  1457. Enter a semicolon to complete the statement, and `mysql' will execute
  1458. it:
  1459.      mysql> SELECT USER()
  1460.          -> ;
  1461.      +--------------------+
  1462.      | USER()             |
  1463.      +--------------------+
  1464.      | joesmith@localhost |
  1465.      +--------------------+
  1466. The `'>' and `">' prompts occur during string collection.  In *MySQL*,
  1467. you can write strings surrounded by either `'' or `"' characters (for
  1468. example, `'hello'' or `"goodbye"'), and `mysql' lets you enter strings
  1469. that span multiple lines.  When you see a `'>' or `">' prompt, it means
  1470. that you've entered a line containing a string that begins with a `''
  1471. or `"' quote character, but have not yet entered the matching quote
  1472. that terminates the string.  That's fine if you really are entering a
  1473. multiple-line string, but how likely is that?  Not very.  More often,
  1474. the `'>' and `">' prompts indicate that you've inadvertantly left out a
  1475. quote character.  For example:
  1476.      mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
  1477.          ">
  1478. If you enter this `SELECT' statement, then hit RETURN and wait for the
  1479. result, nothing will happen.  Instead of wondering why this query takes
  1480. so long, notice the clue provided by the `">' prompt.  It tells you
  1481. that `mysql' expects to see the rest of an unterminated string.  (Do
  1482. you see the error in the statement?  The string `"Smith' is missing the
  1483. second quote.)
  1484. At this point, what do you do?  The simplest thing is to cancel the
  1485. command.  However, you cannot just type `c' in this case, because
  1486. `mysql' interprets it as part of the string that it is collecting!
  1487. Instead, enter the closing quote character (so `mysql' knows you've
  1488. finished the string), then type `c':
  1489.      mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
  1490.          "> "c
  1491.      mysql>
  1492. The prompt changes back to `mysql>', indicating that `mysql' is ready
  1493. for a new command.
  1494. It's important to know what the `'>' and `">' prompts signify, because
  1495. if you mistakenly enter an unterminated string, any further lines you
  1496. type will appear to be ignored by `mysql' -- including a line
  1497. containing `QUIT'!  This can be quite confusing, especially if you
  1498. don't know that you need to supply the terminating quote before you can
  1499. cancel the current command.
  1500. Examples of Common Queries
  1501. ==========================
  1502. Here are examples of how to solve some common problems with *MySQL*.
  1503. Some of the examples use the table `shop' to hold the price of each
  1504. article (item number) for certain traders (dealers).  Supposing that
  1505. each trader has a single fixed price per article, then (`item',
  1506. `trader') is a primary key for the records.
  1507. Start the command line tool `mysql' and select a database:
  1508.      mysql your-database-name
  1509. (In most *MySQL* installations, you can use the database-name 'test').
  1510. You can create the example table as:
  1511.      CREATE TABLE shop (
  1512.       article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
  1513.       dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
  1514.       price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
  1515.       PRIMARY KEY(article, dealer));
  1516.      
  1517.      INSERT INTO shop VALUES
  1518.      (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
  1519.      (3,'D',1.25),(4,'D',19.95);
  1520. Okay, so the example data is:
  1521.      mysql> SELECT * FROM shop;
  1522.      
  1523.      +---------+--------+-------+
  1524.      | article | dealer | price |
  1525.      +---------+--------+-------+
  1526.      |    0001 | A      |  3.45 |
  1527.      |    0001 | B      |  3.99 |
  1528.      |    0002 | A      | 10.99 |
  1529.      |    0003 | B      |  1.45 |
  1530.      |    0003 | C      |  1.69 |
  1531.      |    0003 | D      |  1.25 |
  1532.      |    0004 | D      | 19.95 |
  1533.      +---------+--------+-------+
  1534. The Maximum Value for a Column
  1535. ------------------------------
  1536. "What's the highest item number?"
  1537.      SELECT MAX(article) AS article FROM shop
  1538.      
  1539.      +---------+
  1540.      | article |
  1541.      +---------+
  1542.      |       4 |
  1543.      +---------+
  1544. The Row Holding the Maximum of a Certain Column
  1545. -----------------------------------------------
  1546. "Find number, dealer, and price of the most expensive article."
  1547. In ANSI SQL this is easily done with a sub-query:
  1548.      SELECT article, dealer, price
  1549.      FROM   shop
  1550.      WHERE  price=(SELECT MAX(price) FROM shop)
  1551. In *MySQL* (which does not yet have sub-selects), just do it in two
  1552. steps:
  1553.   1. Get the maximum price value from the table with a `SELECT'
  1554.      statement.
  1555.   2. Using this value compile the actual query:
  1556.           SELECT article, dealer, price
  1557.           FROM   shop
  1558.           WHERE  price=19.95
  1559. Another solution is to sort all rows descending by price and only get
  1560. the first row using the *MySQL* specific `LIMIT' clause:
  1561.      SELECT article, dealer, price
  1562.      FROM   shop
  1563.      ORDER BY price DESC
  1564.      LIMIT 1
  1565. *NOTE*:  If there are several most expensive articles (for example,
  1566. each 19.95) the `LIMIT' solution shows only one of them!
  1567. Maximum of Column per Group
  1568. ---------------------------
  1569. "What's the highest price per article?"
  1570.      SELECT article, MAX(price) AS price
  1571.      FROM   shop
  1572.      GROUP BY article
  1573.      
  1574.      +---------+-------+
  1575.      | article | price |
  1576.      +---------+-------+
  1577.      |    0001 |  3.99 |
  1578.      |    0002 | 10.99 |
  1579.      |    0003 |  1.69 |
  1580.      |    0004 | 19.95 |
  1581.      +---------+-------+
  1582. The Rows Holding the Group-wise Maximum of a Certain Field
  1583. ----------------------------------------------------------
  1584. "For each article, find the dealer(s) with the most expensive price."
  1585. In ANSI SQL, I'd do it with a sub-query like this:
  1586.      SELECT article, dealer, price
  1587.      FROM   shop s1
  1588.      WHERE  price=(SELECT MAX(s2.price)
  1589.                    FROM shop s2
  1590.                    WHERE s1.article = s2.article)
  1591. In *MySQL* it's best do it in several steps:
  1592.   1. Get the list of (article,maxprice).
  1593.   2. For each article get the corresponding rows that have the stored
  1594.      maximum price.
  1595. This can easily be done with a temporary table:
  1596.      CREATE TEMPORARY TABLE tmp (
  1597.              article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
  1598.              price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);
  1599.      
  1600.      LOCK TABLES shop read;
  1601.      
  1602.      INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
  1603.      
  1604.      SELECT shop.article, dealer, shop.price FROM shop, tmp
  1605.      WHERE shop.article=tmp.article AND shop.price=tmp.price;
  1606.      
  1607.      UNLOCK TABLES;
  1608.      
  1609.      DROP TABLE tmp;
  1610. If you don't use a `TEMPORARY' table, you must also lock the 'tmp'
  1611. table.
  1612. "Can it be done with a single query?"
  1613. Yes, but only by using a quite inefficient trick that I call the
  1614. "MAX-CONCAT trick":
  1615.      SELECT article,
  1616.             SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
  1617.        0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
  1618.      FROM   shop
  1619.      GROUP BY article;
  1620.      
  1621.      +---------+--------+-------+
  1622.      | article | dealer | price |
  1623.      +---------+--------+-------+
  1624.      |    0001 | B      |  3.99 |
  1625.      |    0002 | A      | 10.99 |
  1626.      |    0003 | C      |  1.69 |
  1627.      |    0004 | D      | 19.95 |
  1628.      +---------+--------+-------+
  1629. The last example can, of course, be made a bit more efficient by doing
  1630. the splitting of the concatenated column in the client.
  1631. Using user variables
  1632. --------------------
  1633. You can use *MySQL* user variables to remember results without having
  1634. to store them in a temporary variables in the client.  *Note
  1635. Variables::.
  1636. For example, to find the articles with the highest and lowest price you
  1637. can do:
  1638.      select @min_price:=min(price),@max_price:=max(price) from shop;
  1639.      select * from shop where price=@min_price or price=@max_price;
  1640.      
  1641.      +---------+--------+-------+
  1642.      | article | dealer | price |
  1643.      +---------+--------+-------+
  1644.      |    0003 | D      |  1.25 |
  1645.      |    0004 | D      | 19.95 |
  1646.      +---------+--------+-------+
  1647. Using Foreign Keys
  1648. ------------------
  1649. You don't need foreign keys to join 2 tables.
  1650. The only thing *MySQL* doesn't do is `CHECK' to make sure that the keys
  1651. you use really exist in the table(s) you're referencing and it doesn't
  1652. automatically delete rows from table with a foreign key definition. If
  1653. you use your keys like normal, it'll work just fine:
  1654.      CREATE TABLE persons (
  1655.          id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  1656.          name CHAR(60) NOT NULL,
  1657.          PRIMARY KEY (id)
  1658.      );
  1659.      
  1660.      CREATE TABLE shirts (
  1661.          id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  1662.          style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
  1663.          color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
  1664.          owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
  1665.          PRIMARY KEY (id)
  1666.      );
  1667.      
  1668.      
  1669.      INSERT INTO persons VALUES (NULL, 'Antonio Paz');
  1670.      
  1671.      INSERT INTO shirts VALUES
  1672.      (NULL, 'polo', 'blue', LAST_INSERT_ID()),
  1673.      (NULL, 'dress', 'white', LAST_INSERT_ID()),
  1674.      (NULL, 't-shirt', 'blue', LAST_INSERT_ID());
  1675.      
  1676.      
  1677.      INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');
  1678.      
  1679.      INSERT INTO shirts VALUES
  1680.      (NULL, 'dress', 'orange', LAST_INSERT_ID()),
  1681.      (NULL, 'polo', 'red', LAST_INSERT_ID()),
  1682.      (NULL, 'dress', 'blue', LAST_INSERT_ID()),
  1683.      (NULL, 't-shirt', 'white', LAST_INSERT_ID());
  1684.      
  1685.      
  1686.      SELECT * FROM persons;
  1687.      +----+---------------------+
  1688.      | id | name                |
  1689.      +----+---------------------+
  1690.      |  1 | Antonio Paz         |
  1691.      |  2 | Lilliana Angelovska |
  1692.      +----+---------------------+
  1693.      
  1694.      SELECT * FROM shirts;
  1695.      +----+---------+--------+-------+
  1696.      | id | style   | color  | owner |
  1697.      +----+---------+--------+-------+
  1698.      |  1 | polo    | blue   |     1 |
  1699.      |  2 | dress   | white  |     1 |
  1700.      |  3 | t-shirt | blue   |     1 |
  1701.      |  4 | dress   | orange |     2 |
  1702.      |  5 | polo    | red    |     2 |
  1703.      |  6 | dress   | blue   |     2 |
  1704.      |  7 | t-shirt | white  |     2 |
  1705.      +----+---------+--------+-------+
  1706.      
  1707.      
  1708.      SELECT s.* FROM persons p, shirts s
  1709.       WHERE p.name LIKE 'Lilliana%'
  1710.         AND s.owner = p.id
  1711.         AND s.color <> 'white';
  1712.      
  1713.      +----+-------+--------+-------+
  1714.      | id | style | color  | owner |
  1715.      +----+-------+--------+-------+
  1716.      |  4 | dress | orange |     2 |
  1717.      |  5 | polo  | red    |     2 |
  1718.      |  6 | dress | blue   |     2 |
  1719.      +----+-------+--------+-------+
  1720. Searching on Two Keys
  1721. =====================
  1722. *MySQL* doesn't yet optimize when you search on two different keys
  1723. combined with `OR' (Searching on one key with different `OR' parts is
  1724. optimized quite good):
  1725.      SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
  1726.      OR  field2_index = '1'
  1727. The reason is that we haven't yet had time to come up with an efficient
  1728. way to handle this in the general case. (The `AND' handling is, in
  1729. comparison, now completely general and works very well).
  1730. For the moment you can solve this very efficently by using a
  1731. `TEMPORARY' table. This type of optimization is also very good if you
  1732. are using very complicated queries where the SQL server does the
  1733. optimizations in the wrong order.
  1734.      CREATE TEMPORARY TABLE tmp
  1735.      SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';
  1736.      INSERT INTO tmp
  1737.      SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
  1738.      SELECT * from tmp;
  1739.      DROP TABLE tmp;
  1740. The above way to solve this query is in effect an `UNION' of two
  1741. queries.
  1742. Creating and Using a Database
  1743. =============================
  1744. Now that you know how to enter commands, it's time to access a database.
  1745. Suppose you have several pets in your home (your menagerie) and you'd
  1746. like to keep track of various types of information about them.  You can
  1747. do so by creating tables to hold your data and loading them with the
  1748. desired information.  Then you can answer different sorts of questions
  1749. about your animals by retrieving data from the tables.  This section
  1750. shows you how to:
  1751.    * Create a database
  1752.    * Create a table
  1753.    * Load data into the table
  1754.    * Retrieve data from the table in various ways
  1755.    * Use multiple tables
  1756. The menagerie database will be simple (deliberately), but it is not
  1757. difficult to think of real-world situations in which a similar type of
  1758. database might be used.  For example, a database like this could be
  1759. used by a farmer to keep track of livestock, or by a veterinarian to
  1760. keep track of patient records.
  1761. Use the `SHOW' statement to find out what databases currently exist on
  1762. the server:
  1763.      mysql> SHOW DATABASES;
  1764.      +----------+
  1765.      | Database |
  1766.      +----------+
  1767.      | mysql    |
  1768.      | test     |
  1769.      | tmp      |
  1770.      +----------+
  1771. The list of databases is probably different on your machine, but the
  1772. `mysql' and `test' databases are likely to be among them.  The `mysql'
  1773. database is required because it describes user access privileges.  The
  1774. `test' database is often provided as a workspace for users to try
  1775. things out.
  1776. If the `test' database exists, try to access it:
  1777.      mysql> USE test
  1778.      Database changed
  1779. Note that `USE', like `QUIT', does not require a semicolon.  (You can
  1780. terminate such statements with a semicolon if you like; it does no
  1781. harm.)  The `USE' statement is special in another way, too:  it must be
  1782. given on a single line.
  1783. You can use the `test' database (if you have access to it) for the
  1784. examples that follow, but anything you create in that database can be
  1785. removed by anyone else with access to it.  For this reason, you should
  1786. probably ask your *MySQL* administrator for permission to use a
  1787. database of your own.  Suppose you want to call yours `menagerie'.  The
  1788. administrator needs to execute a command like this:
  1789.      mysql> GRANT ALL ON menagerie.* TO your_mysql_name;
  1790. where `your_mysql_name' is the *MySQL* user name assigned to you.
  1791. Creating and Selecting a Database
  1792. ---------------------------------
  1793. If the administrator creates your database for you when setting up your
  1794. permissions, you can begin using it.  Otherwise, you need to create it
  1795. yourself:
  1796.      mysql> CREATE DATABASE menagerie;
  1797. Under Unix, database names are case sensitive (unlike SQL keywords), so
  1798. you must always refer to your database as `menagerie', not as
  1799. `Menagerie', `MENAGERIE', or some other variant.  This is also true for
  1800. table names.  (Under Windows, this restriction does not apply, although
  1801. you must refer to databases and tables using the same lettercase
  1802. throughout a given query.)
  1803. Creating a database does not select it for use; you must do that
  1804. explicitly.  To make `menagerie' the current database, use this command:
  1805.      mysql> USE menagerie
  1806.      Database changed
  1807. Your database needs to be created only once, but you must select it for
  1808. use each time you begin a `mysql' session.  You can do this by issuing a
  1809. `USE' statement as shown above.  Alternatively, you can select the
  1810. database on the command line when you invoke `mysql'.  Just specify its
  1811. name after any connection parameters that you might need to provide.
  1812. For example:
  1813.      shell> mysql -h host -u user -p menagerie
  1814.      Enter password: ********
  1815. Note that `menagerie' is not your password on the command just shown.
  1816. If you want to supply your password on the command line after the `-p'
  1817. option, you must do so with no intervening space (for example, as
  1818. `-pmypassword', not as `-p mypassword').  However, putting your
  1819. password on the command line is not recommended, because doing so
  1820. exposes it to snooping by other users logged in on your machine.
  1821. Creating a Table
  1822. ----------------
  1823. Creating the database is the easy part, but at this point it's empty, as
  1824. `SHOW TABLES' will tell you:
  1825.      mysql> SHOW TABLES;
  1826.      Empty set (0.00 sec)
  1827. The harder part is deciding what the structure of your database should
  1828. be: what tables you will need and what columns will be in each of them.
  1829. You'll want a table that contains a record for each of your pets.  This
  1830. can be called the `pet' table, and it should contain, as a bare minimum,
  1831. each animal's name.  Because the name by itself is not very
  1832. interesting, the table should contain other information.  For example,
  1833. if more than one person in your family keeps pets, you might want to
  1834. list each animal's owner.  You might also want to record some basic
  1835. descriptive information such as species and sex.
  1836. How about age?  That might be of interest, but it's not a good thing to
  1837. store in a database.  Age changes as time passes, which means you'd
  1838. have to update your records often.  Instead, it's better to store a
  1839. fixed value such as date of birth.  Then, whenever you need age, you
  1840. can calculate it as the difference between the current date and the
  1841. birth date.  *MySQL* provides functions for doing date arithmetic, so
  1842. this is not difficult.  Storing birth date rather than age has other
  1843. advantages, too:
  1844.    * You can use the database for tasks such as generating reminders
  1845.      for upcoming pet birthdays.  (If you think this type of query is
  1846.      somewhat silly, note that it is the same question you might ask in
  1847.      the context of a business database to identify clients to whom
  1848.      you'll soon need to send out birthday greetings, for that
  1849.      computer-assisted personal touch.)
  1850.    * You can calculate age in relation to dates other than the current
  1851.      date.  For example, if you store death date in the database, you
  1852.      can easily calculate how old a pet was when it died.
  1853. You can probably think of other types of information that would be
  1854. useful in the `pet' table, but the ones identified so far are
  1855. sufficient for now: name, owner, species, sex, birth, and death.
  1856. Use a `CREATE TABLE' statement to specify the layout of your table:
  1857.      mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
  1858.          -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
  1859. `VARCHAR' is a good choice for the `name', `owner', and `species'
  1860. columns because the column values will vary in length.  The lengths of
  1861. those columns need not all be the same, and need not be `20'.  You can
  1862. pick any length from `1' to `255', whatever seems most reasonable to
  1863. you.  (If you make a poor choice and it turns out later that you need a
  1864. longer field, *MySQL* provides an `ALTER TABLE' statement.)
  1865. Animal sex can be represented in a variety of ways, for example, `"m"'
  1866. and `"f"', or perhaps `"male"' and `"female"'.  It's simplest to use
  1867. the single characters `"m"' and `"f"'.
  1868. The use of the `DATE' data type for the `birth' and `death' columns is
  1869. a fairly obvious choice.
  1870. Now that you have created a table, `SHOW TABLES' should produce some
  1871. output:
  1872.      mysql> SHOW TABLES;
  1873.      +---------------------+
  1874.      | Tables in menagerie |
  1875.      +---------------------+
  1876.      | pet                 |
  1877.      +---------------------+
  1878. To verify that your table was created the way you expected, use a
  1879. `DESCRIBE' statement:
  1880.      mysql> DESCRIBE pet;
  1881.      +---------+-------------+------+-----+---------+-------+
  1882.      | Field   | Type        | Null | Key | Default | Extra |
  1883.      +---------+-------------+------+-----+---------+-------+
  1884.      | name    | varchar(20) | YES  |     | NULL    |       |
  1885.      | owner   | varchar(20) | YES  |     | NULL    |       |
  1886.      | species | varchar(20) | YES  |     | NULL    |       |
  1887.      | sex     | char(1)     | YES  |     | NULL    |       |
  1888.      | birth   | date        | YES  |     | NULL    |       |
  1889.      | death   | date        | YES  |     | NULL    |       |
  1890.      +---------+-------------+------+-----+---------+-------+
  1891. You can use `DESCRIBE' any time, for example, if you forget the names of
  1892. the columns in your table or what types they are.
  1893. Loading Data into a Table
  1894. -------------------------
  1895. After creating your table, you need to populate it.  The `LOAD DATA' and
  1896. `INSERT' statements are useful for this.
  1897. Suppose your pet records can be described as shown below.  (Observe
  1898. that *MySQL* expects dates in `YYYY-MM-DD' format; this may be
  1899. different than what you are used to.)
  1900. *name*       *owner*      *species*    *sex*        *birth*      *death*
  1901. Fluffy       Harold       cat          f            1993-02-04   
  1902. Claws        Gwen         cat          m            1994-03-17   
  1903. Buffy        Harold       dog          f            1989-05-13   
  1904. Fang         Benny        dog          m            1990-08-27   
  1905. Bowser       Diane        dog          m            1998-08-31   1995-07-29
  1906. Chirpy       Gwen         bird         f            1998-09-11   
  1907. Whistler     Gwen         bird                      1997-12-09   
  1908. Slim         Benny        snake        m            1996-04-29   
  1909. Because you are beginning with an empty table, an easy way to populate
  1910. it is to create a text file containing a row for each of your animals,
  1911. then load the contents of the file into the table with a single
  1912. statement.
  1913. You could create a text file `pet.txt' containing one record per line,
  1914. with values separated by tabs, and given in the order in which the
  1915. columns were listed in the `CREATE TABLE' statement.  For missing
  1916. values (such as unknown sexes or death dates for animals that are still
  1917. living), you can use `NULL' values.  To represent these in your text
  1918. file, use `N'.  For example, the record for Whistler the bird would
  1919. look like this (where the whitespace between values is a single tab
  1920. character):
  1921. `Whistler'  `Gwen'      `bird'      `N'        `1997-12-09'       `N'
  1922. To load the text file `pet.txt' into the `pet' table, use this command:
  1923.      mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
  1924. You can specify the column value separator and end of line marker
  1925. explicitly in the `LOAD DATA' statement if you wish, but the defaults
  1926. are tab and linefeed.  These are sufficient for the statement to read
  1927. the file `pet.txt' properly.
  1928. When you want to add new records one at a time, the `INSERT' statement
  1929. is useful.  In its simplest form, you supply values for each column, in
  1930. the order in which the columns were listed in the `CREATE TABLE'
  1931. statement.  Suppose Diane gets a new hamster named Puffball.  You could
  1932. add a new record using an `INSERT' statement like this:
  1933.      mysql> INSERT INTO pet
  1934.          -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
  1935. Note that string and date values are specified as quoted strings here.
  1936. Also, with `INSERT', you can insert `NULL' directly to represent a
  1937. missing value.  You do not use `N' like you do with `LOAD DATA'.
  1938. From this example, you should be able to see that there would be a lot
  1939. more typing involved to load your records initially using several
  1940. `INSERT' statements rather than a single `LOAD DATA' statement.
  1941. Retrieving Information from a Table
  1942. -----------------------------------
  1943. The `SELECT' statement is used to pull information from a table.  The
  1944. general form of the statement is:
  1945.      SELECT what_to_select
  1946.      FROM which_table
  1947.      WHERE conditions_to_satisfy
  1948. `what_to_select' indicates what you want to see.  This can be a list of
  1949. columns, or `*' to indicate "all columns." `which_table' indicates the
  1950. table from which you want to retrieve data.  The `WHERE' clause is
  1951. optional.  If it's present, `conditions_to_satisfy' specifies
  1952. conditions that rows must satisfy to qualify for retrieval.
  1953. Selecting All Data
  1954. ..................
  1955. The simplest form of `SELECT' retrieves everything from a table:
  1956.      mysql> SELECT * FROM pet;
  1957.      +----------+--------+---------+------+------------+------------+
  1958.      | name     | owner  | species | sex  | birth      | death      |
  1959.      +----------+--------+---------+------+------------+------------+
  1960.      | Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
  1961.      | Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
  1962.      | Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
  1963.      | Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
  1964.      | Bowser   | Diane  | dog     | m    | 1998-08-31 | 1995-07-29 |
  1965.      | Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
  1966.      | Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
  1967.      | Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
  1968.      | Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
  1969.      +----------+--------+---------+------+------------+------------+
  1970. This form of `SELECT' is useful if you want to review your entire table,
  1971. for instance, after you've just loaded it with your initial dataset.
  1972. As it happens, the output just shown reveals an error in your data
  1973. file:  Bowser appears to have been born after he died!  Consulting your
  1974. original pedigree papers, you find that the correct birth year is 1989,
  1975. not 1998.
  1976. There are are least a couple of ways to fix this:
  1977.    * Edit the file `pet.txt' to correct the error, then empty the table
  1978.      and reload it using `DELETE' and `LOAD DATA':
  1979.           mysql> SET AUTOCOMMIT=1;  # Used for quick re-create of the table
  1980.           mysql> DELETE FROM pet;
  1981.           mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
  1982.      However, if you do this, you must also re-enter the record for
  1983.      Puffball.
  1984.    * Fix only the erroneous record with an `UPDATE' statement:
  1985.           mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
  1986. As shown above, it is easy to retrieve an entire table.  But typically
  1987. you don't want to do that, particularly when the table becomes large.
  1988. Instead, you're usually more interested in answering a particular
  1989. question, in which case you specify some constraints on the information
  1990. you want.  Let's look at some selection queries in terms of questions
  1991. about your pets that they answer.
  1992. Selecting Particular Rows
  1993. .........................
  1994. You can select only particular rows from your table.  For example, if
  1995. you want to verify the change that you made to Bowser's birth date,
  1996. select Bowser's record like this:
  1997.      mysql> SELECT * FROM pet WHERE name = "Bowser";
  1998.      +--------+-------+---------+------+------------+------------+
  1999.      | name   | owner | species | sex  | birth      | death      |
  2000.      +--------+-------+---------+------+------------+------------+
  2001.      | Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
  2002.      +--------+-------+---------+------+------------+------------+
  2003. The output confirms that the year is correctly recorded now as 1989,
  2004. not 1998.
  2005. String comparisons are normally case insensitive, so you can specify the
  2006. name as `"bowser"', `"BOWSER"', etc.  The query result will be the same.
  2007. You can specify conditions on any column, not just `name'.  For example,
  2008. if you want to know which animals were born after 1998, test the `birth'
  2009. column:
  2010.      mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
  2011.      +----------+-------+---------+------+------------+-------+
  2012.      | name     | owner | species | sex  | birth      | death |
  2013.      +----------+-------+---------+------+------------+-------+
  2014.      | Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
  2015.      | Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
  2016.      +----------+-------+---------+------+------------+-------+
  2017. You can combine conditions, for example, to locate female dogs:
  2018.      mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
  2019.      +-------+--------+---------+------+------------+-------+
  2020.      | name  | owner  | species | sex  | birth      | death |
  2021.      +-------+--------+---------+------+------------+-------+
  2022.      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  2023.      +-------+--------+---------+------+------------+-------+
  2024. The preceding query uses the `AND' logical operator.  There is also an
  2025. `OR' operator:
  2026.      mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";
  2027.      +----------+-------+---------+------+------------+-------+
  2028.      | name     | owner | species | sex  | birth      | death |
  2029.      +----------+-------+---------+------+------------+-------+
  2030.      | Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
  2031.      | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
  2032.      | Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
  2033.      +----------+-------+---------+------+------------+-------+
  2034. `AND' and `OR' may be intermixed.  If you do that, it's a good idea to
  2035. use parentheses to indicate how conditions should be grouped:
  2036.      mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
  2037.          -> OR (species = "dog" AND sex = "f");
  2038.      +-------+--------+---------+------+------------+-------+
  2039.      | name  | owner  | species | sex  | birth      | death |
  2040.      +-------+--------+---------+------+------------+-------+
  2041.      | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  2042.      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  2043.      +-------+--------+---------+------+------------+-------+
  2044. Selecting Particular Columns
  2045. ............................
  2046. If you don't want to see entire rows from your table, just name the
  2047. columns in which you're interested, separated by commas.  For example,
  2048. if you want to know when your animals were born, select the `name' and
  2049. `birth' columns:
  2050.      mysql> SELECT name, birth FROM pet;
  2051.      +----------+------------+
  2052.      | name     | birth      |
  2053.      +----------+------------+
  2054.      | Fluffy   | 1993-02-04 |
  2055.      | Claws    | 1994-03-17 |
  2056.      | Buffy    | 1989-05-13 |
  2057.      | Fang     | 1990-08-27 |
  2058.      | Bowser   | 1989-08-31 |
  2059.      | Chirpy   | 1998-09-11 |
  2060.      | Whistler | 1997-12-09 |
  2061.      | Slim     | 1996-04-29 |
  2062.      | Puffball | 1999-03-30 |
  2063.      +----------+------------+
  2064. To find out who owns pets, use this query:
  2065.      mysql> SELECT owner FROM pet;
  2066.      +--------+
  2067.      | owner  |
  2068.      +--------+
  2069.      | Harold |
  2070.      | Gwen   |
  2071.      | Harold |
  2072.      | Benny  |
  2073.      | Diane  |
  2074.      | Gwen   |
  2075.      | Gwen   |
  2076.      | Benny  |
  2077.      | Diane  |
  2078.      +--------+
  2079. However, notice that the query simply retrieves the `owner' field from
  2080. each record, and some of them appear more than once.  To minimize the
  2081. output, retrieve each unique output record just once by adding the
  2082. keyword `DISTINCT':
  2083.      mysql> SELECT DISTINCT owner FROM pet;
  2084.      +--------+
  2085.      | owner  |
  2086.      +--------+
  2087.      | Benny  |
  2088.      | Diane  |
  2089.      | Gwen   |
  2090.      | Harold |
  2091.      +--------+
  2092. You can use a `WHERE' clause to combine row selection with column
  2093. selection.  For example, to get birth dates for dogs and cats only, use
  2094. this query:
  2095.      mysql> SELECT name, species, birth FROM pet
  2096.          -> WHERE species = "dog" OR species = "cat";
  2097.      +--------+---------+------------+
  2098.      | name   | species | birth      |
  2099.      +--------+---------+------------+
  2100.      | Fluffy | cat     | 1993-02-04 |
  2101.      | Claws  | cat     | 1994-03-17 |
  2102.      | Buffy  | dog     | 1989-05-13 |
  2103.      | Fang   | dog     | 1990-08-27 |
  2104.      | Bowser | dog     | 1989-08-31 |
  2105.      +--------+---------+------------+
  2106. Sorting Rows
  2107. ............
  2108. You may have noticed in the preceding examples that the result rows are
  2109. displayed in no particular order.  However, it's often easier to examine
  2110. query output when the rows are sorted in some meaningful way.  To sort a
  2111. result, use an `ORDER BY' clause.
  2112. Here are animal birthdays, sorted by date:
  2113.      mysql> SELECT name, birth FROM pet ORDER BY birth;
  2114.      +----------+------------+
  2115.      | name     | birth      |
  2116.      +----------+------------+
  2117.      | Buffy    | 1989-05-13 |
  2118.      | Bowser   | 1989-08-31 |
  2119.      | Fang     | 1990-08-27 |
  2120.      | Fluffy   | 1993-02-04 |
  2121.      | Claws    | 1994-03-17 |
  2122.      | Slim     | 1996-04-29 |
  2123.      | Whistler | 1997-12-09 |
  2124.      | Chirpy   | 1998-09-11 |
  2125.      | Puffball | 1999-03-30 |
  2126.      +----------+------------+
  2127. To sort in reverse order, add the `DESC' (descending) keyword to the
  2128. name of the column you are sorting by:
  2129.      mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
  2130.      +----------+------------+
  2131.      | name     | birth      |
  2132.      +----------+------------+
  2133.      | Puffball | 1999-03-30 |
  2134.      | Chirpy   | 1998-09-11 |
  2135.      | Whistler | 1997-12-09 |
  2136.      | Slim     | 1996-04-29 |
  2137.      | Claws    | 1994-03-17 |
  2138.      | Fluffy   | 1993-02-04 |
  2139.      | Fang     | 1990-08-27 |
  2140.      | Bowser   | 1989-08-31 |
  2141.      | Buffy    | 1989-05-13 |
  2142.      +----------+------------+
  2143. You can sort on multiple columns.  For example, to sort by type of
  2144. animal, then by birth date within animal type with youngest animals
  2145. first, use the following query:
  2146.      mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
  2147.      +----------+---------+------------+
  2148.      | name     | species | birth      |
  2149.      +----------+---------+------------+
  2150.      | Chirpy   | bird    | 1998-09-11 |
  2151.      | Whistler | bird    | 1997-12-09 |
  2152.      | Claws    | cat     | 1994-03-17 |
  2153.      | Fluffy   | cat     | 1993-02-04 |
  2154.      | Fang     | dog     | 1990-08-27 |
  2155.      | Bowser   | dog     | 1989-08-31 |
  2156.      | Buffy    | dog     | 1989-05-13 |
  2157.      | Puffball | hamster | 1999-03-30 |
  2158.      | Slim     | snake   | 1996-04-29 |
  2159.      +----------+---------+------------+
  2160. Note that the `DESC' keyword applies only to the column name immediately
  2161. preceding it (`birth'); `species' values are still sorted in ascending
  2162. order.
  2163. Date Calculations
  2164. .................
  2165. *MySQL* provides several functions that you can use to perform
  2166. calculations on dates, for example, to calculate ages or extract parts
  2167. of dates.
  2168. To determine how many years old each of your pets is, compute age as the
  2169. difference between the birth date and the current date.  Do this by
  2170. converting the two dates to days, take the difference, and divide by
  2171. 365 (the number of days in a year):
  2172.      mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet;
  2173.      +----------+-------------------------------------+
  2174.      | name     | (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
  2175.      +----------+-------------------------------------+
  2176.      | Fluffy   |                                6.15 |
  2177.      | Claws    |                                5.04 |
  2178.      | Buffy    |                                9.88 |
  2179.      | Fang     |                                8.59 |
  2180.      | Bowser   |                                9.58 |
  2181.      | Chirpy   |                                0.55 |
  2182.      | Whistler |                                1.30 |
  2183.      | Slim     |                                2.92 |
  2184.      | Puffball |                                0.00 |
  2185.      +----------+-------------------------------------+
  2186. Although the query works, there are some things about it that could be
  2187. improved.  First, the result could be scanned more easily if the rows
  2188. were presented in some order.  Second, the heading for the age column
  2189. isn't very meaningful.
  2190. The first problem can be handled by adding an `ORDER BY name' clause to
  2191. sort the output by name.  To deal with the column heading, provide a
  2192. name for the column so that a different label appears in the output
  2193. (this is called a column alias):
  2194.      mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
  2195.          -> FROM pet ORDER BY name;
  2196.      +----------+------+
  2197.      | name     | age  |
  2198.      +----------+------+
  2199.      | Bowser   | 9.58 |
  2200.      | Buffy    | 9.88 |
  2201.      | Chirpy   | 0.55 |
  2202.      | Claws    | 5.04 |
  2203.      | Fang     | 8.59 |
  2204.      | Fluffy   | 6.15 |
  2205.      | Puffball | 0.00 |
  2206.      | Slim     | 2.92 |
  2207.      | Whistler | 1.30 |
  2208.      +----------+------+
  2209. To sort the output by `age' rather than `name', just use a different
  2210. `ORDER BY' clause:
  2211.      mysql>  SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
  2212.          ->  FROM pet ORDER BY age;
  2213.      +----------+------+
  2214.      | name     | age  |
  2215.      +----------+------+
  2216.      | Puffball | 0.00 |
  2217.      | Chirpy   | 0.55 |
  2218.      | Whistler | 1.30 |
  2219.      | Slim     | 2.92 |
  2220.      | Claws    | 5.04 |
  2221.      | Fluffy   | 6.15 |
  2222.      | Fang     | 8.59 |
  2223.      | Bowser   | 9.58 |
  2224.      | Buffy    | 9.88 |
  2225.      +----------+------+
  2226. A similar query can be used to determine age at death for animals that
  2227. have died.  You determine which animals these are by checking whether
  2228. or not the `death' value is `NULL'.  Then, for those with non-`NULL'
  2229. values, compute the difference between the `death' and `birth' values:
  2230.      mysql>  SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age
  2231.          ->  FROM pet WHERE death IS NOT NULL ORDER BY age;
  2232.      +--------+------------+------------+------+
  2233.      | name   | birth      | death      | age  |
  2234.      +--------+------------+------------+------+
  2235.      | Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
  2236.      +--------+------------+------------+------+
  2237. The query uses `death IS NOT NULL' rather than `death != NULL' because
  2238. `NULL' is a special value.  This is explained later.  *Note Working
  2239. with `NULL': Working with NULL.
  2240. What if you want to know which animals have birthdays next month?  For
  2241. this type of calculation, year and day are irrelevant; you simply want
  2242. to extract the month part of the `birth' column.  *MySQL* provides