信息化 频道

脱离企业战略 IT曲线救国也能成功

6 创建数据库对象

(1)创建表

在测试MYSQL创建的时候还遇到了一些小问题,这里整理出来供大家参考:

mysql> CREATE TABLE TEST(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> MC VARCHAR(60),DT DATE DEFAULT NOW()); ERROR 1067 (42000): Invalid default value for 'DT'

注意: AUTO_INCREMENT为MYSQL的自增类型。我们可以利用如下函数查询最后一个序列号的值:

mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 3 | +------------------+ 1 row in set (0.06 sec)
本来想在创建表的时候给DT字段一个DEFAULT值(当前时间),但是出现错误,尝试了几个MYSQL的函数(如CURDATE()等)都是如此,查阅了一下资料得出结论:

MYSQL的DEFAULT值只能是常量,如果想实现上述功能只有表中第一个TIMESTAMP类型字段可以做到。可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。如果你有多个TIMESTAMP列,只有第一个自动更新。自动更新第一个TIMESTAMP列在下列任何条件下发生:

A、列没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。
B、列没有明确地在一个UPDATE语句中指定且一些另外的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)
C、明确地设定TIMESTAMP列为NULL或NOW()。

格式:TIMESTAMP[(M)]

MySQL可以以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD、YYMMDD格式来显示TIMESTAMP值,这主要取决于M值,它们分别为14(缺省值)\12\8\6。
mysql> CREATE TABLE TEST(ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> MC VARCHAR(60),DT TIMESTAMP); Query OK, 0 rows affected (1.08 sec) mysql> SHOW COLUMNS FROM TEST; +-------+-------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+-------------------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | MC | varchar(60) | YES | | NULL | | | DT | timestamp | NO | | CURRENT_TIMESTAMP | | +-------+-------------+------+-----+-------------------+----------------+ 3 rows in set (0.17 sec) mysql> insert into test(mc) values('ZhangSan'); Query OK, 1 row affected (0.13 sec) mysql> select * from test; +----+----------+---------------------+ | ID | MC | DT | +----+----------+---------------------+ | 1 | ZhangSan | 2007-05-25 09:54:59 | +----+----------+---------------------+ 1 row in set (0.06 sec)
注意:为表TEST新增加TIMESTAMP类型字段,我们发现不是表的第一个TIMESTAMP类型的字段的DEFAULT值不是系统时间。
mysql> ALTER TABLE TEST ADD RQ TIMESTAMP; Query OK, 1 row affected (0.70 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SHOW COLUMNS FROM TEST; +-------+-------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------------------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | MC | varchar(60) | YES | | NULL | | | DT | timestamp | NO | | CURRENT_TIMESTAMP | | | RQ | timestamp | NO | | 0000-00-00 00:00:00 | | +-------+-------------+------+-----+---------------------+----------------+ 4 rows in set (0.19 sec) mysql> INSERT INTO TEST(MC) VALUES('LiSi'); Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM TEST; +----+----------+---------------------+---------------------+ | ID | MC | DT | RQ | +----+----------+---------------------+---------------------+ | 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 | | 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 | +----+----------+---------------------+---------------------+ 2 rows in set (0.01 sec) mysql> INSERT INTO TEST(MC,RQ) VALUES('LiSi',NOW()); Query OK, 1 row affected (0.11 sec) mysql> SELECT * FROM TEST; +----+----------+---------------------+---------------------+ | ID | MC | DT | RQ | +----+----------+---------------------+---------------------+ | 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 | | 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 | | 3 | LiSi | 2007-05-25 10:03:29 | 2007-05-25 10:03:29 | +----+----------+---------------------+---------------------+ 3 rows in set (0.00 sec)
注意:执行UPDATE操作,表中第一个TIMESTAMP字段自动修改为系统时间。
mysql> UPDATE TEST SET MC='WangWu' WHERE ID=3; Query OK, 1 row affected (0.13 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM TEST; +----+----------+---------------------+---------------------+ | ID | MC | DT | RQ | +----+----------+---------------------+---------------------+ | 1 | ZhangSan | 2007-05-25 09:54:59 | 0000-00-00 00:00:00 | | 2 | LiSi | 2007-05-25 10:02:47 | 0000-00-00 00:00:00 | | 3 | WangWu | 2007-05-25 10:04:01 | 2007-05-25 10:03:29 | +----+----------+---------------------+---------------------+ 1 rows in set (0.00 sec)

创建临时表

MYSQL临时表是SESSION级别的,并且程序退出临表自动删除。

mysql> CREATE TEMPORARY TABLE TEMP(ID VARCHAR(20),MC VARCHAR(60)); Query OK, 0 rows affected (0.08 sec) mysql> insert into temp values('111','111111'); Query OK, 1 row affected (0.08 sec) mysql> select * from temp; +------+--------+ | ID | MC | +------+--------+ | 111 | 111111 | +------+--------+ 1 row in set (0.00 sec)


0
相关文章