一:mysql数据库的 表的创建,主键,外键的设置
1:安装的时候选择 utf-8 字符
2:创建数据库的时候 选择默认
3:创建表 引擎 字符 都选择默认
MySQL中利用外键实现级联删除、更新
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在 创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。
因为只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。我所使用的版本是Mysql5.1版本的 mysql-5.1.51-win32.msi 使用的mysql图形界面是 SQLyog-10.0.0-0.zip
但是保存之后,点击修改一定要确定是这样的
接下来是外键,创建一个新闻回复表,其中新闻回复表的newsid 这个外键引用的是 新闻表的 newsid
设置回复表的newsid外键,引用的是news表的 newsid主键,并且做了一个 级联删除,当news表的 newsid删除的时候,外检表 新闻回复表也会跟着删除
二:如果是 .net 2.0 环境,则无法使用微软企业库 5.0 版本,(微软企业库5.0版本 支持 .net 3.5 和 4.0 ,不支持 2.0)
三:asp.net 调用 mysql的方法 asp.net中使用MYSQL参数化的方法 需要将 sql中的 @ 换成 ?
MySqlConnection conn = new MySqlConnection(connStr); conn.Open(); MySqlCommand cmd = new MySqlCommand("select count(1) from qyexam_notice where title=?title",conn); cmd.Parameters.Add(new MySqlParameter("?title", "《测试试卷》2011/12/14 10:47:00开始")); object obj = cmd.ExecuteScalar(); conn.Close(); Response.Write("结果:"+obj);
四:mysql存储过程特殊的规范
DELIMITER $$ CREATE PROCEDURE `aaa`(p_id VARCHAR(64)) BEGIN SELECT * FROM news WHERE newsid=p_id LIMIT 1; END$$ DELIMITER ;
注意要写 DELIMITER $$ 开头和 DELIMITER ;结尾,begin和end之间的语句记得写 ; 结尾, 然后存储过程的名字和特殊的字符不是 []而是左上角tab键上的`
五:调用存储过程的时候,参数的顺序必须要和存储过程里面的参数顺序一模一样,如何调用存储过程
CREATE PROCEDURE tb_ad_hitrecord_GetCount(p_starttime DATETIME,p_endtime DATETIME,p_AdId INT) BEGIN SELECT COUNT(1) FROM tb_ad_hitrecord WHERE (`HitDate` BETWEEN p_starttime AND p_endtime) AND AdId=p_AdId; END$$ DELIMITER ;
在mysql的查询分析器调用的时候 :如何调用存储过程呢?用 CALL 关键字,时间用 逗号 而不是 # 号
CALL `tb_ad_hitrecord_GetCount`('2012-07-04 15:16:25','2012-07-07 09:11:36',1)
CALL `tb_ad_hitrecord_ADD`(1,'#2012-07-05#')
同样的,在asp.net的代码中调用存储过程的时候,写参数也一定要按照mysql的存储过程的参数来写,顺序不能像sql那样乱调。
六:获取刚插入的数据的id,使用select max(id) from table ? mysql也提供了一个类似于 sqlserver一样的 @@identity 这样的函数 叫做
LAST_INSERT_ID()
一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。LAST_INSERT_ID是基于单个connection的, 不可能被其它的客户端连接改变。
DELIMITER $$ USE `edt_date`$$ DROP PROCEDURE IF EXISTS `tb_ad_hitrecord_ADD`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `tb_ad_hitrecord_ADD`(p_AdId INT,p_HitDate DATETIME) BEGIN INSERT INTO tb_ad_hitrecord(AdId,HitDate)VALUES(p_AdId,p_HitDate); -- select max(HitId) from tb_ad_hitrecord; SELECT LAST_INSERT_ID(); END$$ DELIMITER ;
注意事项
(1)、查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的。
mysql> SELECT LAST_INSERT_ID();
-> 100
使用这函数向一个给定Connection对象返回的值是该Connection对象产生对影响AUTO_INCREMENT列的最新语句第一个AUTO_INCREMENT值的。这个值不能被其它Connection对象的影响,即它们产生它们自己的AUTO_INCREMENT值。
(2)、LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID返回表b中的Id值。
(3)、 假如你使用一条INSERT语句插入多个行, LAST_INSERT_ID() 只返回插入的第一行数据时产生的值。其原因是这使依靠其它服务器复制同样的 INSERT语句变得简单。
mysql> INSERT INTO t VALUES
-> (NULL, ‘Mary’), (NULL, ‘Jane’), (NULL, ‘Lisa’);
mysql> SELECT * FROM t;
| id | name |
+—-+——+
| 1 | Bob |
| 2 | Mary |
| 3 | Jane |
| 4 | Lisa |
mysql> SELECT LAST_INSERT_ID(); //这就是我要说明的关键问题。
| LAST_INSERT_ID() |
| 2 |
虽然将3 个新行插入 t, 对这些行的第一行产生的 ID 为 2, 这也是 LAST_INSERT_ID()返回的值。
(4)、假如你使用 INSERT IGNORE而记录被忽略,则AUTO_INCREMENT (自动增长列的)计数器不会增量,而 LAST_INSERT_ID() 返回0, 这反映出没有插入任何记录。
七:mysql如何插入带时间的sql语句,不是用 #号,而是用 逗号 即可
insert into news(id,time) values(1,'2012-07-04 15:16:25')