修改字段存储类型:
最常用同步关于库权限查询指令,基础预备:查一下数据库有用户及权限:
select distinct concat('user: ''',user,'''@''',host,''';') as query from mysql.user;
=================================================================
mysql> show create database jackxiang_mysql;
+-----------------+----------------------------------------------------------------------------+
| Database | Create Database |
+-----------------+----------------------------------------------------------------------------+
| jackxiang_mysql | CREATE DATABASE `jackxiang_mysql` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+-----------------+----------------------------------------------------------------------------+
依葫芦画瓢:
建表基本结构都有:
如果是字符串的 NOT NULL DEFAULT '';
如果是数字型的 NOT NULL DEFAULT 0;
有兄弟说default '' 跨库也麻烦,不如default null:
用is null 和 ='' 都无法全部查询出来,有些人写程序,很容易把默认null的字段 插入成'',但是默认的很多数据又是null,这样一个字段会有 ''和null同时存在。
在上面表中加个索引:
Default值设定及Null设定
字符串:
alter table t_tst_root add busiLevel varchar(255) default '' not null after f_Id;
Int整形:
alter table t_tst_root add f_TstProjId int(10) default 0 not null after f_Id;
ALTER TABLE `Tbl_File` ADD PRIMARY KEY ( `FFileId` )
ALTER TABLE `Tbl_File` CHANGE `FFileId` `FFileId` INT( 11 ) NOT NULL AUTO_INCREMENT
________________________________________________________________________________________________
ALTER TABLE `temperatureone` CHANGE `nowTempValue` `nowTempValue` FLOAT(5,2) NOT NULL COMMENT '现在温度'
PHPMyadmin:
字段 nowTempValue
类型 FLOAT
长度/值*1 5,2
________________________________________________________________________________________________
alter table test add index id(id); //id不能有引号
加一个字段:
如果想要添加在某个字段的后面则是这样的:
想要修改一个字段及默认值:
把字段由text类似修改为var_char类型(我的bo-blog,里的字段作优化,bo-blog不更新了,自己作如下优化):
mysql里的长度简述:
CHAR(M) 0<M<=255(建议CHAR(1)外,超过此长度的用VARCHAR) M个字符(所占空间跟字符集等有关系)
VARCHAR(M) 0<M<65532/N M个字符(N大小由字符集,以及是否为中文还是字母数字等有关系)
TEXT 64K个字符 所占空间跟字符集等有关系
想删除某个字段:
添加索引、删除索引:
alter table `boblog_blogs` add index blogalias(blogalias);
alter table `boblog_blogs` drop index blogalias;
alter table boblog_blogs add FULLTEXT(content); //全文索引
扩大字段的长度:
修改表字段的默认值为空不为null:
修改表字段enum的新类型none:
# 修改表的注释
# 修改字段的注释 --注意:字段名和字段类型照写就行
添加一个自增长字段并且添在最前面用first,如下:
ALTER TABLE `object_video_upload` ADD `id` INT(32) NOT NULL AUTO_INCREMENT COMMENT 'auto_increase comment' first;
如果我在一个表上两个字段指定auto_increment呢?
mysql> create table tab_auto_incr(a int not null auto_increment,b int not null auto_increment,primary key (a),unique key (b));
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key//是:Innodb:
InnoDb引擎中对auto_increment的误解:http://jiuchen.sinaapp.com/136.html
结论3:在InnoDB中,auto_increment至少需要单独为索引字段(主键也是索引的一种)。
结论4:在InnoDB中,auto_increment可以和其他字段组成联合索引,但auto_increment必须位于最左侧(和MyISAM不同)。
所以,如果表已经建立好了,想加一个id并为auto_increment的字段得,先建立这个字段(暂还能有auto_increment的属性,否则报错如上),再添加索引,再修改这个字段为auto_increment,操作如下,并实践Ok,发现这个新加的id确实变为自动由1,2,3...这样的值了:
MYISM:
不行!说明一个表只能有一个auto_increment,且该列必须是primary key或者unique key。
更多:http://blog.csdn.net/feihong247/article/details/7748788
# 查看字段注释的方法 --show
要想一个字段是AUTO_INCREMENT ,它必须是一个索引,刚才一时心急,搞忘记了,备份下。
其根本是:create table Tbl_File_XXX(select * from Tbl_File_Bak_XXX); 这个语句在表Tbl_File_XXX中是不会有索引的。
以后怎么解决这个问题:
create table aaa like Tbl_User
insert into table select xxx
加在最前面FIRST :
ALTER TABLE `jiu` ADD `11` VARCHAR( 1 ) NOT NULL FIRST ;
测试Ok,索引带过来了:
create table aaa like Tbl_File_Bak;
导入: insert into aaa select * from Tbl_File_Bak;
示例:
=====================================================================
drop table Tbl_File;
create table Tbl_File like Tbl_File_Bak;
insert into Tbl_File select * from Tbl_File_Bak;
source /home/admin/745.txt
=====================================================================
直接select into 不会复制任何索引和主键,一般先create table like ,然后再select into
mysql> create table cc like test;
Query OK, 0 rows affected (0.04 sec)
mysql> desc cc;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
mysql> insert into cc (select * from test);
mysql>Query OK, 5 rows affected (0.01 sec)
Over!
create table cs_bak1 as(select * from test) ; //备份表数据一模一样的,但索引没了,默认引擎和编码:服务器默认的存储引擎而不是源表的存储引擎
create table cs_bak like test; //相同的结构来创建一个新表,列名、数据类型、空指和索引也将复制,但是表的内容不会被复制。外键和专用的权限也没有被复制。
参考对比URL:http://phpdeveloper.cn/mysql-mysql%E5%A4%8D%E5%88%B6%E8%A1%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95
select into在Mysql中不适用,不支持:
现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去,虽然可以用以下语句进行复制,总觉得不爽,希望各位帮助下我,谢谢。
answer 01:
create table dust select * from student;//用于复制前未创建新表dust的情况下
answer 02:
insert into dust select * from student;//已经创建了新表dust的情况下
现在请各位用select..into..语句实现以上东东,谢谢支持,再次感谢!
网友回复:该回复于2008-09-29 06:37:03被版主删除
网友回复:sqlserver可以那樣寫,但是mySql中貌似不行哦,另外樓主你說的那兩種寫法,應該是最常見的啊
网友回复:create table dust select * from student;
网友回复:楼上的写的是我发的里面的啊,我要的是 select into 语句的啊?
请各位大侠帮忙,谢谢!
网友回复:MySQL不支持Select Into语句直接备份表结构和数据,一些种方法可以代替, 也有其它方法可以处理,总结如下:
方法1:
MYSQL不支持:
Select * Into new_table_name from old_table_name;
替代方法:
Create table new_table_name (Select * from old_table_name);
来源:http://hi.baidu.com/%D3%D2%CA%D6%C4%AA%D4%FA%CC%D8%B5%C4/blog/item/ed236851533190818d5430b3.html
一、
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '合作伙伴ID',
PRIMARY KEY (`id`),
UNIQUE KEY `verifycode` (`verifycode`,`eid`)
二、
新加一个字段:
ALTER TABLE `object_partner` ADD `eid` VARCHAR( 16 ) NOT NULL AFTER `coop_type`
三、
把这新加的字段再加为联合索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD PRIMARY KEY ( `verifycode` , `eid` )
四、
添加一个id字段与表开头 FIRST:
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
五、
给这个id字段加上primary索引(因前面加过primary索引,不能现再加出现下面提示):
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
六、给前面第三步的primary联合索引去掉后加上 UNIQUE 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD UNIQUE (
`verifycode` ,
`eid`
)
七、去掉后,给id字段加上前面的primary 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` ADD INDEX ( `id` )
use 某个DB后:
status
可以看到DB的情况,尤其是乱码的问题等:
默认:
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
set names utf8 后:
Server characterset: latin
Db characterset: latin
Client characterset: utf8
Conn. characterset: utf8
导入依旧有问题,正确的应该默认就是DB:Utf8,导入才会可能正常:
Server characterset: latin1
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
mysql> ALTER TABLE `Tbl_User_NNN` ADD INDEX ( `FMemo_Extra` ( 16 ) ) ;
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0
添加mysql数据库字段
使用ALTER TABLE [表名] ADD [字段]s语句……
索引
1.普通索引。
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。
(2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2.唯一索引。
它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));
实践成功如下:
3.主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。
//主键549830479
alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);//增加一个新列549830479
alter table t2 add d timestamp;
alter table infos add ex tinyint not null default '0';//删除列549830479
alter table t2 drop column c;//重命名列549830479
alter table t1 change a b integer;
//改变列的类型549830479
alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default '0';
//重命名表549830479
alter table t1 rename t2;加索引549830479
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);加主关键字的索引549830479
mysql> alter table tablename add primary key(id);加唯一限制条件的索引549830479
mysql> alter table tablename add unique emp_name2(cardnumber);删除某个索引549830479
mysql>alter table tablename drop index emp_name;修改表:549830479
增加字段:549830479
mysql> ALTER TABLE table_name ADD field_name field_type;修改原字段名称及类型:549830479
mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;删除字段:549830479
mysql> ALTER TABLE table_name DROP field_name;
参考:http://flyer2010.iteye.com/blog/1064390
最常用同步关于库权限查询指令,基础预备:查一下数据库有用户及权限:
select distinct concat('user: ''',user,'''@''',host,''';') as query from mysql.user;
=================================================================
mysql> show create database jackxiang_mysql;
+-----------------+----------------------------------------------------------------------------+
| Database | Create Database |
+-----------------+----------------------------------------------------------------------------+
| jackxiang_mysql | CREATE DATABASE `jackxiang_mysql` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+-----------------+----------------------------------------------------------------------------+
依葫芦画瓢:
建表基本结构都有:
如果是字符串的 NOT NULL DEFAULT '';
如果是数字型的 NOT NULL DEFAULT 0;
有兄弟说default '' 跨库也麻烦,不如default null:
用is null 和 ='' 都无法全部查询出来,有些人写程序,很容易把默认null的字段 插入成'',但是默认的很多数据又是null,这样一个字段会有 ''和null同时存在。
在上面表中加个索引:
Default值设定及Null设定
字符串:
alter table t_tst_root add busiLevel varchar(255) default '' not null after f_Id;
Int整形:
alter table t_tst_root add f_TstProjId int(10) default 0 not null after f_Id;
ALTER TABLE `Tbl_File` ADD PRIMARY KEY ( `FFileId` )
ALTER TABLE `Tbl_File` CHANGE `FFileId` `FFileId` INT( 11 ) NOT NULL AUTO_INCREMENT
________________________________________________________________________________________________
ALTER TABLE `temperatureone` CHANGE `nowTempValue` `nowTempValue` FLOAT(5,2) NOT NULL COMMENT '现在温度'
PHPMyadmin:
字段 nowTempValue
类型 FLOAT
长度/值*1 5,2
________________________________________________________________________________________________
alter table test add index id(id); //id不能有引号
加一个字段:
如果想要添加在某个字段的后面则是这样的:
想要修改一个字段及默认值:
把字段由text类似修改为var_char类型(我的bo-blog,里的字段作优化,bo-blog不更新了,自己作如下优化):
mysql里的长度简述:
CHAR(M) 0<M<=255(建议CHAR(1)外,超过此长度的用VARCHAR) M个字符(所占空间跟字符集等有关系)
VARCHAR(M) 0<M<65532/N M个字符(N大小由字符集,以及是否为中文还是字母数字等有关系)
TEXT 64K个字符 所占空间跟字符集等有关系
想删除某个字段:
添加索引、删除索引:
alter table `boblog_blogs` add index blogalias(blogalias);
alter table `boblog_blogs` drop index blogalias;
alter table boblog_blogs add FULLTEXT(content); //全文索引
扩大字段的长度:
修改表字段的默认值为空不为null:
修改表字段enum的新类型none:
# 修改表的注释
# 修改字段的注释 --注意:字段名和字段类型照写就行
添加一个自增长字段并且添在最前面用first,如下:
ALTER TABLE `object_video_upload` ADD `id` INT(32) NOT NULL AUTO_INCREMENT COMMENT 'auto_increase comment' first;
如果我在一个表上两个字段指定auto_increment呢?
mysql> create table tab_auto_incr(a int not null auto_increment,b int not null auto_increment,primary key (a),unique key (b));
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key//是:Innodb:
InnoDb引擎中对auto_increment的误解:http://jiuchen.sinaapp.com/136.html
结论3:在InnoDB中,auto_increment至少需要单独为索引字段(主键也是索引的一种)。
结论4:在InnoDB中,auto_increment可以和其他字段组成联合索引,但auto_increment必须位于最左侧(和MyISAM不同)。
所以,如果表已经建立好了,想加一个id并为auto_increment的字段得,先建立这个字段(暂还能有auto_increment的属性,否则报错如上),再添加索引,再修改这个字段为auto_increment,操作如下,并实践Ok,发现这个新加的id确实变为自动由1,2,3...这样的值了:
MYISM:
不行!说明一个表只能有一个auto_increment,且该列必须是primary key或者unique key。
更多:http://blog.csdn.net/feihong247/article/details/7748788
# 查看字段注释的方法 --show
要想一个字段是AUTO_INCREMENT ,它必须是一个索引,刚才一时心急,搞忘记了,备份下。
其根本是:create table Tbl_File_XXX(select * from Tbl_File_Bak_XXX); 这个语句在表Tbl_File_XXX中是不会有索引的。
以后怎么解决这个问题:
create table aaa like Tbl_User
insert into table select xxx
加在最前面FIRST :
ALTER TABLE `jiu` ADD `11` VARCHAR( 1 ) NOT NULL FIRST ;
测试Ok,索引带过来了:
create table aaa like Tbl_File_Bak;
导入: insert into aaa select * from Tbl_File_Bak;
示例:
=====================================================================
drop table Tbl_File;
create table Tbl_File like Tbl_File_Bak;
insert into Tbl_File select * from Tbl_File_Bak;
source /home/admin/745.txt
=====================================================================
直接select into 不会复制任何索引和主键,一般先create table like ,然后再select into
mysql> create table cc like test;
Query OK, 0 rows affected (0.04 sec)
mysql> desc cc;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(5) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
mysql> insert into cc (select * from test);
mysql>Query OK, 5 rows affected (0.01 sec)
Over!
create table cs_bak1 as(select * from test) ; //备份表数据一模一样的,但索引没了,默认引擎和编码:服务器默认的存储引擎而不是源表的存储引擎
create table cs_bak like test; //相同的结构来创建一个新表,列名、数据类型、空指和索引也将复制,但是表的内容不会被复制。外键和专用的权限也没有被复制。
参考对比URL:http://phpdeveloper.cn/mysql-mysql%E5%A4%8D%E5%88%B6%E8%A1%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95
select into在Mysql中不适用,不支持:
现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去,虽然可以用以下语句进行复制,总觉得不爽,希望各位帮助下我,谢谢。
answer 01:
create table dust select * from student;//用于复制前未创建新表dust的情况下
answer 02:
insert into dust select * from student;//已经创建了新表dust的情况下
现在请各位用select..into..语句实现以上东东,谢谢支持,再次感谢!
网友回复:该回复于2008-09-29 06:37:03被版主删除
网友回复:sqlserver可以那樣寫,但是mySql中貌似不行哦,另外樓主你說的那兩種寫法,應該是最常見的啊
网友回复:create table dust select * from student;
网友回复:楼上的写的是我发的里面的啊,我要的是 select into 语句的啊?
请各位大侠帮忙,谢谢!
网友回复:MySQL不支持Select Into语句直接备份表结构和数据,一些种方法可以代替, 也有其它方法可以处理,总结如下:
方法1:
MYSQL不支持:
Select * Into new_table_name from old_table_name;
替代方法:
Create table new_table_name (Select * from old_table_name);
来源:http://hi.baidu.com/%D3%D2%CA%D6%C4%AA%D4%FA%CC%D8%B5%C4/blog/item/ed236851533190818d5430b3.html
一、
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '合作伙伴ID',
PRIMARY KEY (`id`),
UNIQUE KEY `verifycode` (`verifycode`,`eid`)
二、
新加一个字段:
ALTER TABLE `object_partner` ADD `eid` VARCHAR( 16 ) NOT NULL AFTER `coop_type`
三、
把这新加的字段再加为联合索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD PRIMARY KEY ( `verifycode` , `eid` )
四、
添加一个id字段与表开头 FIRST:
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
五、
给这个id字段加上primary索引(因前面加过primary索引,不能现再加出现下面提示):
ALTER TABLE `object_partner` ADD `id` INT( 11 ) NOT NULL FIRST
六、给前面第三步的primary联合索引去掉后加上 UNIQUE 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` DROP PRIMARY KEY ,
ADD UNIQUE (
`verifycode` ,
`eid`
)
七、去掉后,给id字段加上前面的primary 索引:
ALTER TABLE `cntv_sns_language`.`object_partner` ADD INDEX ( `id` )
use 某个DB后:
status
可以看到DB的情况,尤其是乱码的问题等:
默认:
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
set names utf8 后:
Server characterset: latin
Db characterset: latin
Client characterset: utf8
Conn. characterset: utf8
导入依旧有问题,正确的应该默认就是DB:Utf8,导入才会可能正常:
Server characterset: latin1
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
mysql> ALTER TABLE `Tbl_User_NNN` ADD INDEX ( `FMemo_Extra` ( 16 ) ) ;
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0
添加mysql数据库字段
使用ALTER TABLE [表名] ADD [字段]s语句……
索引
1.普通索引。
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。
(2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2.唯一索引。
它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));
实践成功如下:
3.主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。
//主键549830479
alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);//增加一个新列549830479
alter table t2 add d timestamp;
alter table infos add ex tinyint not null default '0';//删除列549830479
alter table t2 drop column c;//重命名列549830479
alter table t1 change a b integer;
//改变列的类型549830479
alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default '0';
//重命名表549830479
alter table t1 rename t2;加索引549830479
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);加主关键字的索引549830479
mysql> alter table tablename add primary key(id);加唯一限制条件的索引549830479
mysql> alter table tablename add unique emp_name2(cardnumber);删除某个索引549830479
mysql>alter table tablename drop index emp_name;修改表:549830479
增加字段:549830479
mysql> ALTER TABLE table_name ADD field_name field_type;修改原字段名称及类型:549830479
mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;删除字段:549830479
mysql> ALTER TABLE table_name DROP field_name;
参考:http://flyer2010.iteye.com/blog/1064390
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/821/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2022-10-13 17:14
评论列表