lMySq;
//外键必须主键里有才能插入。要删除先删副表再删主表
下载安装Tomcat & MySQL
Tomcat配置
如果出现
Unable to find a Javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
...
Tomcat ClassPath配置如下:
C:\Program Files\Apache Software Foundation\Tomcat 5.0\bin\bootstrap.jar;C:\Program Files\Java\jdk1.5.0\lib\tools.jar
MySQL配置
c:\mysql\bin>mysqld //启动mysql的服务进程
c:\mysql\bin\mysql -uroot //连接到mysql数据库
mysql>update user set password=PASSWORD('<new_root_password>') where user='root';
mysql>flush privileges;
上面的操作是修改root用户的密码,'<new_root_password>'是你设置的密码。
mysql>create database gamedb; //创建gamedb库
mysql>connect gamedb; //连接到gamedb库
mysql>source gamedb.sql; //gamedb初始化建表
mysql>GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP, REFERENCES, LOCK TABLES, CREATE TEMPORARY TABLES ON gamedb.* TO gamedb@localhost IDENTIFIED BY '<gamedb_password>'; mysql>flush privileges;
上面是建立gamedb用户,<gamedb_password>为gamedb用户的密码。
mysql>exit; //退出 .
安装JDBC
mysql-connector-java-3.0.15-ga.zip解压后将mysql-connector-java-3.0.15-ga-bin.jar 复制到%TOMCAT_HOME%\common\lib下
..
配置Tomcat
假设:数据库:gamedb 用户名:gamedb 密码:gamedb
.
第一步: http://127.0.0.1:8080,进入tomcat页,用tomcat的 Tomcat Administration--->Resources--->Data Sources页面添加,参数如下:
JNDI Name: jdbc/mysql
Data Source URL: jdbc:mysql://localhost:3306/gamedb?autoReconnect=true&useUnicode=true&characterEncoding=GB2312
JDBC Driver Class: com.mysql.jdbc.Driver
User Name: gamedb
Password: gamedb
Max. Active Connections: 4
Max. Idle Connections: 2
Max. Wait for Connection:5000
Validation Query ://不添 ..
..
第二步: 试页内加入代码你自己在mysql里建个表检单测试一下吧,我这里以ght_users表为例,在你的应用下做一个测试用的test.JSP,然后http访问这个jsp页,test.jsp代码如下
<%@ page contentType = "text/html; charset=gb2312" %>
<%@ page import = "java.sql.*" %>
<%@ page import = "javax.naming.*" %>
<%@ page import = "javax.sql.*" %>
<%
Context ctx=null;
DataSource ds=null;
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
ctx = new InitialContext();
if( ctx == null )
out.println("no context");
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
if( ds == null )
out.println("no datasource");
conn = ds.getConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String strSql = " select * from ght_users";
rs = stmt.executeQuery(strSql);
while(rs.next()){ out.println(rs.getString(1)); }
}
catch(Exception ex)
{
ex.printStackTrace();
out.println(ex.toString());
}
finally{
if( rs != null )
rs.close();
if( stmt != null )
stmt.close();
if( conn != null)
conn.close();
if( ctx != null )
ctx.close();
} %> ...
...
常见问题
Q:出现javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
A: 在yourWebApp\WEB-INF\web.XML中增加
<resource-ref>
<description>jdbc/mysql</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Q:出现org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '?' for onnect URL 'null',这是为什么?
A: 在%TOMCAT_HOME%\conf\Catalina\localhost下找到你的web应用对应的.xml文件,如test.xml,并在此文件的下添入代码:
<ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSourcer"/> ..
重启tomcat。
注意:
for tomcat-5.0.18 i use ROOT in tomcat as by web app i put the following entry in E:\jakarta-tomcat-5.0.18\conf\Catalina\localhost\ROOT.xml file for tomcat-4.1.18 i use ROOT in tomcat as my webapp i put the following entry in E:\qrules\tomcat\jakarta-tomcat-4.1.18\conf\server.xml <ResourceLink name="jdbc/quickstart" type="javax.sql.DataSource" global="jdbc/quickstart"/> ..
Web界面配DBCP时,生成的是服务器的全局JNDI资源,查看%TOMCAT_HOME%\conf\server.xml可以得知tomcat修改了server.xml,在<server>下的<GlobalNamingResources>下添入了一些数据后的server.xml:
<?xml version='1.0' encoding='utf-8'?>
<Server>
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <GlobalNamingResources>
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>
<Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
<Resource name="jdbc/mysql" type="javax.sql.DataSource"/>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>
<ResourceParams name="jdbc/mysql">
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>4</value>
</parameter>
<parameter>
<name>password</name>
<value>gamedb</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/gamedb?autoReconnect=true&useUnicode=true&characterEncoding=GB2312</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>2</value>
</parameter>
<parameter>
<name>username</name>
<value>gamedb</value>
</parameter>
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
<Service name="Catalina">
<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" port="8080" redirectPort="8443" maxSpareThreads="75" maxThreads="150" minSpareThreads="25">
</Connector>
<Connector port="8009" protocol="AJP/1.3" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" redirectPort="8443">
</Connector>
<Engine defaultHost="localhost" name="Catalina">
<Host apPBase="webapps" name="localhost">
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log." suffix=".txt" timestamp="true"/>
</Host>
<Logger className="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
</Engine>
</Service>
</Server>
.
Q:如何配制DBCP只应用于指定的web application呢?
A:tomcat 5.x以后将web application的从server.xml里分离了出来,放在了 %TOMCAT_HOME%\conf\Catalina\localhost下,如你的应用为test, 那么在这个目录下就会有一个相应的test.xml与之对应,如:
<?xml version='1.0' encoding='utf-8'?>
<Context displayName="Tomcat Test Application" docBase="C:/Program Files/Apache Software Foundation/Tomcat 5.5/server/webapps/test" path="/test" privileged="true" workDir="work\Catalina\localhost\test"> ... </Context>
.
Q:我如何解决中乱码问题?
A:在配制mysql的数据库url时我们加入了useUnicode=true&characterEncoding=GB2312参数,指定数据库编码方式为GB2312,其它还需要做的就是常用的一些方式,如指定 <%@ page contentType = "text/html; charset=gb2312" %>、使用filter等,这方面的资料很多,这里不再累述。 ..
这里需要注意的是url中的“&“符号,如果手动在.xml内配制时,需将其转换为“&”
启动:net start mySql;
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
列出数据库:show databases;
选择数据库:use databaseName;
列出表格:show tables; 按F7可以调用刚刚输入的命令。清楚错误的按ESC 或/C
Create database hdx default character set utf8;
显示表格列的属性:show columns from tableName;
建立数据库:source fileName.txt;
导出SQL语句 :mysqldump –uroot -p>d:/student.sql//不用分号
导入SQL语句;mysql –uroot –p<d:/student.sql//不用分号
Source d:/student.sql;
可以再student.sql中写入sql语句select * from studnt;
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
增加一个字段:alter table tabelName add column fieldName dateType;
Alter table stud add column 字段名 varchar(50);
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
增加一个管理员帐户:grant all on *.* to user@localhost identified by "password"; grant on 数据库名 to “登入用户名”@”localhost”identified by “密码” 赋值权限。
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
查询时间:select now();
查询当前用户:select user();
查询数据库版本:select version();
查询当前使用的数据库:select database();
1、删除student_course数据库中的students数据表:
rm -f student_course/students.*
2、备份数据库:(将数据库test备份)
mysqldump -u root -p test>c:\test.txt
备份表格:(备份test数据库下的mytable表格)
mysqldump -u root -p test mytable>c:\test.txt
将备份数据导入到数据库:(导回test数据库)
mysql -u root -p test
3、创建临时表:(建立临时表zengchao)
create temporary table zengchao(name varchar(10));
create table user(id int(10) unsigned primary key auto_increment,name varchar(50) not null,age tinyint(2) default 0 )default character set utf8;;//unsigned非负用逗号 设置字符utf8就近原则status;可以查看这个可以在安装软件时通用设置好。就不会有这边操作。
Select * from stu where name like “李”; “%李”名称:包含”雨的””%雨%”
Select if(sex,”男生”,”女生”),as name,sex from stu ;//sex 设成 0,1 的作用。起别名的方法是返回array 方便区分起小名用于区分很清楚的。(作用:返回结果集中的字段比较多时,返回数组麻烦起别名区分。2,在多个表有子段冲突的时候为字段起别名 id不知道是那个表的时候起别名)
用concat 把起名的字符串和字段连接:
Select contat(“姓名:”,name,”性别:”,sex”QQ:.qq”)from stu;
Concat(“姓名”””,name,”性别”””,sex)//字段过长起别名
//上面会返回一个集合//把一个集合封装在别名中 有点像建立视图
Select contat(“姓名:”,name,”性别:”,if(sex,”男”,”女”)”QQ:.qq”) as stuinfo from stu;
Select * from stu where name like “李”;
Select if(sex,”男生”,”女生”),as stusex,sname from stu ;
//在原表的基础上添加字段
Alter table stu add birday date;
Update stu set birday:”1993/9/23”;//把表设置成utf8就可以设置
//实现分页
Select * from stu where sex=0 order by id desc limit 3;/asc
//查找年龄最大的学生(只有学生的出生日期)
Select name birday from stu order by birday asc limit 1;//最大按升序排序
//查找年龄最2大的学生(只有学生的出生日期)
Select name birday from stu limit 0.1://系统会默认方式自动查出
Select name birday from stu order by birday limit 0.1;//根据数组方式0代表第一行数据1取一列。要取第2列就是1,1也可以取2条数据就是1,2;
只有排序之后才能截取。
//查找年龄最2大的里面有出生年月日1982/10/22相同的学生(只有学生的出生日期)
Select * form where birday <=”1982/10/22”;
Select * from where birday<=(select birday from stu order by birday limit 1.1);//临时表做为子查询返回我们需要的数据。
//得到那年出生的年select year(birday)from stu;
//怎样限制重复的年月只出现一次过滤)select distinct year(birday) as “学生出身年份”from stu;
on update cascade是级联更新的意思,on delete cascade是级联删除的意思,意思就是说当你更新或删除主键表,那外见表也会跟随一起更新或删除
肯定不行的,必须定义了级联删除可以的,不同的级联方式实现的效果是不一样的
以上,希望对你有所帮助!
mysql> create table prinfo(pr_Id int(10)primary key auto_increment not null,proI
d int,buyCount int,po_uuId varchar(20),
foreign key(proId) references product(proId) on delete cascade on update cascade,
foreign key(po_uuId) references prdTotle (po_uuId) on delete cascade on update cascade)
与S QL的对比
create table OrderDetail(
did int identity(1,1) primary key,
proId int foreign key references product(proId),
buyCount int,
oid varchar(30) foreign key references OrderInfo(oid)
)
go
整型
类型 大小 范围
Tinyint 1字节 (-128-127)
Smallint 2字节 (-32768-32767)
Mediumint 3字节 (-8388608-8388607)
Int 4字节
Big int 8字节
DateTime Date 与 SQL对比GETDATE()
NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。
CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。
CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。
浮点型
单精度
Float (0.01)或(0.1) 对比 sql中用的是(2)
Decimal(M,N)//非常准确的M代表只能出现5个数组,N代表出现小数位几个。
二进制
Binary varbinary blob 与SQLSERVER对比Binary、Varbinary固定长度一般存储8K Image用来存储超过8kb的可变长度
声音、图形等二进制数据//把声音图像的地址保存到表里面 外面读取的是地址找到声音图形。也可以把声音和图像存在二进制流的形式表当中。
与字符集无关的
Oxaa oxbb
Header(“content-type:image/jpeg”);
Image 把图像当成普通文本来显示 文本 乱码 (二进制强制转换成字符)
非二进制(字符集 UTF-8(可以在体现多个语种统一选择utf-8万国码) gbk gb2312 big5繁体字符校对规则)字符集就相当于字库 相当于一个字典unicode万国码国际化标准组织制定一套涵盖世界上所有语种。所有符号的编码方案。一个页面上多种语言文字 显示字符集:show character set;
Create table demo(name varchar(20) character set utf8,name2 varchar(30) character set gbk);
Show create table demo;
//出现乱码set names gbk;
Collation校对规则区分大小写排序和查询的 collate utf8_bin 不区分
utf8_general_ci
show variables like “%character%;”校对比较排序用的
//修改表的字符集
Alter table user modify name char(30) character set utf8;
字段会继承表的字符集,表会 继承库的字符集默认。
查看库名:show variables like “%character%;”
Char ,varchar,text
Create table g(price decimal(5,2));
4、创建表是先判断表是否存在
create table if not exists students(……);
5、从已经有的表中复制表的结构
create table table2 select * from table1 where 1<>1;
6、复制表
create table table2 select * from table1;
7、对表重新命名
alter table table1 rename as table2;
修改表添加一列
Alter table 那个表 add add column 列名 varchar(20) not null,
8、修改列的类型
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
9、创建索引
alter table table1 add index ind_id (id);
create index ind_id on table1 (id);
create unique index ind_id on table1 (id);//建立唯一性索引
10、删除索引
drop index idx_id on table1;
alter table table1 drop index ind_id;
11、联合字符或者多个列(将列id与":"和列name和"="连接)
select concat(id,':',name,'=') from students;
12、limit(选出10到20条)<第一个记录集的编号是0>
select * from students order by id limit 9,10;
13、MySQL不支持的功能
事务,视图,外键和引用完整性,存储过程和触发器
14、MySQL会使用索引的操作符号
<,<=,>=,>,=,between,in,不带%或者_开头的like
15、使用索引的缺点
1)减慢增删改数据的速度;
2)占用磁盘空间;
3)增加查询优化器的负担;
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
16、分析索引效率
方法:在一般的SQL语句前加上explain;
分析结果的含义:
1)table:表名;
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
3)possible_keys:查询可以利用的索引名;
4)key:实际使用的索引;
5)key_len:索引中被使用部分的长度(字节);
6)ref:显示列名字或者"const"(不明白什么意思);
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
8)extra:MySQL的建议;
17、使用较短的定长列
1)尽可能使用较短的数据类型;
2)尽可能使用定长数据类型;
a)用char代替varchar,固定长度的数据处理比变长的快些;
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
18、使用not null和enum
尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
19、使用optimize table
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
20、使用procedure analyse()
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
select * from students procedure analyse();
select * from students procedure analyse(16,256);
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
21、使用查询缓存
1)查询缓存的工作方式:
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
2)配置缓存参数:
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与 select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询; query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
22、调整硬件
1)在机器上装更多的内存;
2)增加更快的硬盘以减少I/O等待时间;
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
3)在不同的物理硬盘设备上重新分配磁盘活动;
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
.创建列
alter table tablename add colname type not null default '0';
例:
alter table mmanapp_mmanmedia add appid_id integer not null default 372;
2.删除列
alter table tablename drop column colname;
例:
alter table mmanapp_mmanmedia drop column appid_id;
3.在已经存在的列上创建外键关联
ALTER TABLE yourtablename ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
例:
ALTER TABLE mmanapp_mmanmedia ADD CONSTRAINT fk_mdappid FOREIGN KEY(appid_id)
4.删除外键关联:
ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;
例:
ALTER TABLE mmanapp_mmanmedia DROP FOREIGN KEY fk_mdappid
附文档两份:
一.mysql对列和表的相关操作
增加主键
alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,addprimary key (new_field_id);
增加一个新列
alter table infos add ex tinyint not null default '0';
删除列
alter table t2 drop column c;
重命名列/改变列类型
alter table t1 change a b integer;
alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default '0';
重命名表
alter table t1 rename t2;
加索引
mysql> alter table tablename change depno depno int(5) not null;
mysql> alter table tablename add index 索引名 (字段名1[,字段名2 …]);
mysql> alter table tablename add index emp_name (name);
加主关键字的索引
mysql> alter table tablename add primary key(id);
加唯一限制条件的索引
mysql> alter table tablename add unique emp_name2(cardnumber);
删除某个索引
mysql>alter table tablename drop index emp_name;
二.对表增/删约束关系
InnoDB允许你用ALTER TABLE往一个表中添加一个新的 外键约束:
ALTER TABLE yourtablename
ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
记住先创建需要的索引。你也可以用ALTER TABLE往一个表添加一个自引用外键约束。
InnoDB也支持使用ALTER TABLE来移除 外键:
ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;
当年创建一个外键之时,如果FOREIGN KEY子句包括一个CONSTRAINT名字,你可以引用那个名字来移除 外键。另外,当外键被创建之时,fk_symbol值被InnoDB内部保证。当你想要移除一个外键之时,要找出标记,请使用SHOW CREATE TABLE语句。例子如下:
mysql> SHOW CREATE TABLE ibtest11c\G
*************************** 1. row ***************************
Table: ibtest11c
Create Table: CREATE TABLE `ibtest11c` (
`A` int(11) NOT NULL auto_increment,
`D` int(11) NOT NULL default '0',
`B` varchar(200) NOT NULL default '',
`C` varchar(175) default NULL,
PRIMARY KEY (`A`,`D`,`B`),
KEY `B` (`B`,`C`),
KEY `C` (`C`),
CONSTRAINT `0_38775` FOREIGN KEY (`A`, `D`)
REFERENCES `ibtest11a` (`A`, `D`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `0_38776` FOREIGN KEY (`B`, `C`)
REFERENCES `ibtest11a` (`B`, `C`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARSET=latin1
1 row in set (0.01 sec)
mysql> ALTER TABLE ibtest11c DROP FOREIGN KEY 0_38775;
InnoDB解析程序允许你在FOREIGN KEY ... REFERENCES ...子句中用`(backticks)把表和列名名字围起来。InnoDB解析程序也考虑到lower_case_table_names系统变量的设置。
InnoDB返回一个表的外键定义作为SHOW CREATE TABLE语句输出的一部分:
SHOW CREATE TABLE tbl_name;
从这个版本起,mysqldump也将表的正确定义生成到转储文件中,且并不忘记 外键。
你可以如下对一个表显示外键约束:
SHOW TABLE STATUS FROM db_name LIKE 'tbl_name';
外键约束被列在输出的Comment列。
当执行外键检查之时,InnoDB对它照看着的子或父记录设置共享的行级锁。InnoDB立即检查外键约束,检查不对事务提交延迟。
要使得对有外键关系的表重新载入转储文件变得更容易,mysqldump自动在转储输出中包括一个语句设置FOREIGN_KEY_CHECKS为0。这避免在转储被重新装载之时,与不得不被以特别顺序重新装载的表相关的问题。也可以手动设置这个变量:
mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> SOURCE dump_file_name;
mysql> SET FOREIGN_KEY_CHECKS = 1;
如果转储文件包含对外键是不正确顺序的表,这就以任何顺序导入该表。这样也加快导入操作。设置FOREIGN_KEY_CHECKS为0,对于在LOAD DATA和ALTER TABLE操作中忽略外键限制也是非常有用的。
InnoDB不允许你删除一个被FOREIGN KEY表约束 引用的表,除非你做设置SETFOREIGN_KEY_CHECKS=0。当你移除一个表的时候,在它的创建语句里定义的约束也被移除。
如果你重新创建一个被移除的表,它必须有一个遵从于也引用它的外键约束的定义。它必须有正确的列名和类型,并且如前所述,它必须对被 引用的键有索引。如果这些不被满足,MySQL返回错误号1005 并在错误信息字符串中指向errno 150。
mysql>update user set password=PASSWORD('<new_root_password>') where user='root';
mysql>flush privileges;