mysql添加用户 alter 语句用法,添加、修改、删除、修改字段存储类型,创建UTF-8的数据库和查看数据库编码等

jackxiang 2007-12-20 22:57 | |
修改字段存储类型:


最常用同步关于库权限查询指令,基础预备:查一下数据库有用户及权限:
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
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]