mysql笔记

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&amp;useUnicode=true&amp;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,”性别:ifsex,””,””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)

DecimalM,N//非常准确的M代表只能出现5个数组,N代表出现小数位几个。

 二进制

Binary varbinary blob  SQLSERVER对比BinaryVarbinary固定长度一般存储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(选出1020)<第一个记录集的编号是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
extraMySQL的建议;
 
  17
、使用较短的定长列
  1
)尽可能使用较短的数据类型;
  2
)尽可能使用定长数据类型;
  a
)用char代替varchar,固定长度的数据处理比变长的快些;
  b
)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
  c
)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
  d
)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
 
  18
、使用not nullenum
 
尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
 
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
 
  19
、使用optimize table
 
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAMBDB类型的数据表。实际上任何碎片整理方法都是用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(5not 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 
*************************** 1row *************************** 
       
Table: ibtest11c 
Create TableCREATE TABLE `ibtest11c` ( 
  `A` 
int(11NOT NULL auto_increment, 
  `D` 
int(11NOT NULL default '0'
  `B` 
varchar(200NOT NULL default ''
  `
Cvarchar(175default 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 DATAALTER 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;


你可能感兴趣的:(mysql笔记)