MYSQL基础

Mysql设置某字段唯一

Mysql设置某字段唯一
 
1.建表时加上唯一性约束
 
CREATE TABLE `t_user` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(18) NOT NULL unique,
`password` varchar(18) NOT NULL,
PRIMARY KEY (`Id`)  www.2cto.com  
) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=gbk;
 
2.给已经建好的表加上唯一性约束
ALTER TABLE `t_user` ADD unique(`username`);
 
mysql主键索引和唯一索引
 
1.主键一定是唯一性索引,唯一性索引并不一定就是主键;
2.一个表中可以有多个唯一性索引,但只能有一个主键;
3.主键列不允许空值,而唯一性索引列允许空值。
mysql 创建表并设置主键自增
 
mysql 创建表:  
   
mysql> create table user(  
    -> userid int ( 4 ) primary key not  null  auto_increment,  
    -> username varchar(16 ) not  null ,  
    -> userpassword varchar(32 ) not  null   
    -> ); 
         

mysql更改表结构:添加、删除、修改字段、调整字段顺序(zhuan)

添加字段:

alter table `user_movement_log`
Add column GatewayId int not null default 0 AFTER `Regionid` (在哪个字段后面添加)

删除字段:

alter table `user_movement_log` drop column Gatewayid

调整字段顺序:

ALTER TABLE `user_movement_log` CHANGE `GatewayId` `GatewayId` int not null default 0 AFTER RegionID

//主键

alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);

//增加一个新列

alter table t2 add d timestamp;
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;

修改表:

增加字段:

mysql> ALTER TABLE table_name ADD field_name field_type;

修改原字段名称及类型:

mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;

删除字段:

mysql> ALTER TABLE table_name DROP field_name;

 

MySQL之外键约束

MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION  外键的使用需要满足下列的条件:

  1. 两张表必须都是InnoDB表,并且它们没有临时表。

  2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。

  3. 建立外键关系的对应列必须建立了索引。

  4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

  如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:

  1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

  2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

  3. NO ACTION: InnoDB拒绝删除或者更新父表。

  4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

  5. SET DEFAULT: InnoDB目前不支持。

  外键约束使用最多的两种情况无外乎:

  1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

  2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

  前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

  InnoDB允许你使用ALTER TABLE在一个已经存在的表上增加一个新的外键:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

  InnoDB也支持使用ALTER TABLE来删除外键:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

例子:
mysql>
create table child(id int not null primary key auto_increment,parent_id int,
index par_ind (parent_id),
constraint fk_1 foreign key (parent_id) references
parent(id) on update cascade on delete restrict)
type=innodb;
用上面的:
1). 则可以更新parent记录时,child中的相应记录也会被更新;-->因为: on update cascade
2). 不能是子表操作,影响父表.只能是父表影响子表.
3). 删除外键:
alter table child drop foreign key fk_1;
添加外键:
alter table child add constraint fk_1 foreign key (parent_id) references  parent(id) on update restrict on delete set null;
 
 
MySQL数据库定义 function、procedure、trigger报错:syntax error, unexpected end_of_input, expecting

【出错原因】:默认情况下,mysql是以分号“;”作为一条SQL语句的提交标识符。当我们在编写Function,Store-Procedure,或者触发器的过程中,其中会含有分号“;”;这样就起冲突了,workbench会以分号作为SQL语句提交标识,而Function等代码是以 end 关键字作为提交标识符。

 

     【解决方法】:用delimiter 关键字改变mysql默认的SQL语句的提交标识符。 delimiter 关键字的说明参考:http://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html

 

     【代码示例】:下面的代码就是将SQL语句的提交标识符设为 "//"

delimiter // -- 将SQL标识符设为 '//'  
CREATE PROCEDURE simpleproc (OUT param1 INT)  
BEGIN  
  SELECT COUNT(*) INTO param1 FROM italk.urls;  
END  
//  
delimiter ;  -- 将SQL标识符重新设为 ';' 

 

MySQL 创建主键,外键和复合主键的语句

1.创建主键语法

ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名);

2.创建外键语法

ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列] ;

3.使用组合主键

如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式

①创建时:create table sc (
studentno int,
courseid int,
score int,
primary key (studentno,courseid) );
②修改时:alter table tb_name add primary key (字段1,字段2,字段3);

------------------------------------------------

在我们使用mysql的时候,有时会遇到需要更改或者删除mysql的主键,我们可以简单的使用alter table table_name drop primary key;来完成。下面我使用数据表table_test来作了例子。

1、首先创建一个数据表table_test:
create table table_test(
`id` varchar(100) NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`name`)
)ENGINE=MyISAM DEFAULT CHARSET=gb2312;

2、假设发现主键设置错了,应该是id是主键,但现在表里已经有好多数据了,不能删除表再重建了,只能在这基础上修改表结构。

先删除主键
alter table table_test drop primary key;

然后再添加主键
alter table table_test add primary key(id);

注:在添加主键之前,必须先把重复的id删除掉。

 

--MySQL之Field 'email' doesn't have a default value问题所在,简单解决办法

MySQL在出现这个Field xxx doesn't have a default value错误的原因是:我们设置了该字段为非空,但是我们没有设置默认值照成的。

比如我们创建一个表:

CREATE TABLE IF NOT EXISTS `blog_user` (
  `userid` smallint(5) unsigned NOT NULL auto_increment,
  `username` varchar(20) NOT NULL default '',
  `passwd` char(32) NOT NULL default '',
  `email` varchar(30) NOT NULL,
  PRIMARY KEY  (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


我们对email字段设置了not null 但是没有设置默认值 default,所以我们在插入的时候:
INSERT INTO blog_user(username,passwd) VALUES('tomener',md5(123456));

会报如下错误:
Field 'email' doesn't have a default value

解决办法就是设置一个默认值,比如: `email` varchar(30) NOT NULL DEFAULT ''

很简单吧,就是加一个DEFAULT ''

 

--mysql中删除表记录delete from和truncate table的用法区别

mysql中删除表记录delete from和truncate table的用法区别:
MySQL中有两种删除表中记录的方法,一种是delete from语句,另一种是truncate table语句。
delete from语句可以使用where对要删除的记录进行选择。而使用truncate table将删除表中的所有记录。因此,delete语句更灵活。
如果要清空表中的所有记录,可以使用下面的两种方法:
delete from tablename
truncate table tablename
其中第二条记录中的table是可选的。
如果要删除表中的部分记录,只能使用delete语句。
delete FROM table1 WHERE ;
如果delete不加WHERE子句,那么它和truncate table是一样的,但它们有一点不同,那就是delete可以返回被删除的记录数,而truncate table返回的是0。
如果一个表中有自增字段,使用truncate table和没有WHERE子句的delete删除所有记录后,这个自增字段将起始值恢复成1.如果你不想这样做的话,可以在delete语句中加上永真的WHERE,如WHERE 1或WHERE true。
delete FROM table1 WHERE 1;
上面的语句在执行时将扫描每一条记录。但它并不比较,因为这个WHERE条件永远为true。这样做虽然可以保持自增的最大值,但由于它是扫描了所有的记录,因此,它的执行成本要比没有WHERE子句的delete大得多。
delete和truncate table的最大区别是delete可以通过WHERE语句选择要删除的记录。但执行得速度不快。而且还可以返回被删除的记录数。而truncate table无法删除指定的记录,而且不能返回被删除的记录。但它执行得非常快。
与标准的SQL语句不同,delete支持ORDER BY和LIMIT子句,通过这两个子句,我们可以更好地控制要删除的记录。如当我们只想删除WHERE子句过滤出来的记录的一部分,可以使用LIMIB,如果要删除后几条记录,可以通过ORDER BY和LIMIT配合使用。假设我们要删除users表中name等于"nike"的前6条记录。可以使用如下的delete语句:
delete FROM users WHERE name = 'nike' LIMIT 6;
一般MySQL并不确定删除的这6条记录是哪6条,为了更保险,我们可以使用ORDER BY对记录进行排序。
delete FROM users WHERE name = 'nike' ORDER BY id DESC LIMIT 6;
还有一点就是,如果要删除表中的所有数据,建议使用truncate table, 尤其是表中有大量的数据, 使用truncate table是将表结构重新建一次速度要比使用delete from快很多,而delete from是一行一行的删除,速度很慢.

------------

mysql中没有boolean类型

boolean类型
MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1),
MySQL里有四个常量:true,false,TRUE,FALSE,它们分别代表1,0,1,0,

mysql> select true,false,TRUE,FALSE; 
+------+-------+------+-------+ 
| TRUE | FALSE | TRUE | FALSE | 
+------+-------+------+-------+ 
| 1 | 0 | 1 | 0 | 
+------+-------+------+-------+ 

可以如下插入boolean值:insert into [xxxx(xx)] values(true),当然也可以values(1);
举例如下:

mysql> alter table test add isOk boolean; 
Query OK 
mysql> desc test; 
+-------+-------------+------+-----+---------+----------------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+-------------+------+-----+---------+----------------+ 
| id | int(11) | NO | PRI | NULL | auto_increment | 
| isOk | tinyint(1) | YES | | NULL | | 
+-------+-------------+------+-----+---------+----------------+ 
mysql> insert into test(isOk) values(true); 
Query OK 
mysql> select isOk from test ; 
+------+ 
| isOk | 
+------+ 
| 1 | 
+------+ 

=================
MySQL没有boolean类型。这也是比较奇怪的现象。例:

create table xs 
( 
id int primary key, 
bl boolean 
) 

这样是可以创建成功,但查看一下建表后的语句,就会发现,mysql把它替换成tinyint(1)。也就是说mysql把boolean=tinyInt了,但POJO类要定义成什么类型呢?
因为惯性思维,在java类中也把它定义成type。然后在Struts中使用<s:check/>标签。这就产生一个严重的问题了。<s:check>是boolean,而POJO去定义成byte。这样数据永远也无法提交,被struts的intercept拦截掉了。解决办法是在POJO类中定义成boolean,在mysql中定义成tinyint(1)。

------
TINYINT(1) or ENUM( 'true' , 'false')
-------

你可能感兴趣的:(mysql)