Mysql 8 - SQL全新版本之CREATE TABLE(表名、临时表、表克隆和复制、列数据类型和属性)

本文详细介绍了如何在MySQL中创建表,包括列定义、数据类型、索引、克隆表、临时表以及处理重复键值的方法。重点讲解了NOTNULL、NULL、DEFAULT值、AUTO_INCREMENT属性及LIKE和AS子句的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

create_definition: {
    col_name column_definition
  | {INDEX | KEY} [index_name] [index_type] (key_part,...)
      [index_option] ...
  | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] PRIMARY KEY
      [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
      [index_name] [index_type] (key_part,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (col_name,...)
      reference_definition
  | check_constraint_definition
}

column_definition: {
    data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
      [VISIBLE | INVISIBLE]
      [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [COLLATE collation_name]
      [COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
      [ENGINE_ATTRIBUTE [=] 'string']
      [SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
      [STORAGE {DISK | MEMORY}]
      [reference_definition]
      [check_constraint_definition]
  | data_type
      [COLLATE collation_name]
      [GENERATED ALWAYS] AS (expr)
      [VIRTUAL | STORED] [NOT NULL | NULL]
      [VISIBLE | INVISIBLE]
      [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [reference_definition]
      [check_constraint_definition]
}

data_type:
    (see Chapter 11, Data Types)

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
  | {VISIBLE | INVISIBLE}
  |ENGINE_ATTRIBUTE [=] 'string'
  |SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}

check_constraint_definition:
    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

reference_definition:
    REFERENCES tbl_name (key_part,...)
      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
    table_option [[,] table_option] ...

table_option: {
    AUTOEXTEND_SIZE [=] value
  | AUTO_INCREMENT [=] value
  | AVG_ROW_LENGTH [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | CHECKSUM [=] {0 | 1}
  | [DEFAULT] COLLATE [=] collation_name
  | COMMENT [=] 'string'
  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
  | CONNECTION [=] 'connect_string'
  | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
  | DELAY_KEY_WRITE [=] {0 | 1}
  | ENCRYPTION [=] {'Y' | 'N'}
  | ENGINE [=] engine_name
  | ENGINE_ATTRIBUTE [=] 'string'
  | INSERT_METHOD [=] { NO | FIRST | LAST }
  | KEY_BLOCK_SIZE [=] value
  | MAX_ROWS [=] value
  | MIN_ROWS [=] value
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
  | PASSWORD [=] 'string'
  | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
  | STATS_SAMPLE_PAGES [=] value
  | TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
  | UNION [=] (tbl_name[,tbl_name]...)
}

partition_options:
    PARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
        | RANGE{(expr) | COLUMNS(column_list)}
        | LIST{(expr) | COLUMNS(column_list)} }
    [PARTITIONS num]
    [SUBPARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
      [SUBPARTITIONS num]
    ]
    [(partition_definition [, partition_definition] ...)]

partition_definition:
    PARTITION partition_name
        [VALUES
            {LESS THAN {(expr | value_list) | MAXVALUE}
            |
            IN (value_list)}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [(subpartition_definition [, subpartition_definition] ...)]

subpartition_definition:
    SUBPARTITION logical_name
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

query_expression:
    SELECT ...   (Some valid select or union statement)

CREATE TABLE创建一个具有给定名称的表。必须拥有CREATE该表的权限。

默认情况下,使用InnoDB存储引擎在默认数据库(可以通过use指定)中创建表 。

use mysql;
select DATABASE();
use sys;
select DATABASE();

在这里插入图片描述

如果表存在或没有默认数据库或数据库不存在,则会发生错误。

MySQL对表的数量没有限制。底层文件系统可能对表示表的文件数量有限制。单个存储引擎可能会施加特定于引擎的约束。InnoDB允许多达40亿张表。

表名

可以指定表名为db_name.tbl_name以在特定数据库中创建表。假设数据库存在,无论是否存在默认数据库,这都有效。如果使用带引号的标识符,请分别引用数据库和表名。例如:

`mydb`.`mytbl`  YES
`mydb.mytbl`    NO
drop database if exists jack;
create database jack;
create table jack.kaven(
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);
drop database if exists jack2;
create database jack2;
use jack2;
create table `jack.kaven`(
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);
create table `jack`.`kaven2`(
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);

在这里插入图片描述

如果表存在,为了防止发生错误,可以使用IF NOT EXISTS。但是,不会验证现有表是否具有与CREATE TABLE语句指示的结构相同的结构 ,即只判断表名(表名是数据库中的标识符),而表结构不会进行判断。

create database if not exists jack;
use jack;
create table if not exists kaven(
    id integer auto_increment primary key ,
    username varchar(128) not null unique ,
    password varchar(256) not null default 'password'
)engine 'innodb' character set 'utf8mb4';

create table if not exists kaven(
    id integer auto_increment primary key ,
    username varchar(128) not null unique ,
    password varchar(256) not null default 'password' ,
    address varchar(128) not null
)engine 'innodb' character set 'utf8mb4';

在这里插入图片描述

临时表

创建表时,可以使用TEMPORARY关键字。一个TEMPORARY表只在当前会话中可见,而当会话关闭时会自动删除。

这意味着两个不同的会话可以使用相同的临时表名而不会相互冲突。

TEMPORARY表与数据库的关系非常松散。删除数据库不会自动删除在该数据库中创建的任何TEMPORARY表。

删除数据库后,TEMPORARY表还是可以在当前会话中使用。

create database if not exists jack;
use jack;
create table kaven_1 (
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);
create table kaven_2 (
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);
create temporary table kaven_3 (
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);
create temporary table kaven_4 (
    id integer auto_increment ,
    primary key PRIMARY_KEY(id)
);
drop database jack;
insert into jack.kaven_4(id) values (1),(2),(3);

在这里插入图片描述
要创建临时表,必须具有CREATE TEMPORARY TABLES权限。

表克隆和复制

LIKE

CREATE TABLE ... LIKE根据另一个表的定义创建一个空表,包括原始表中定义的任何列属性和索引:

CREATE TABLE new_tbl LIKE orig_tbl;

副本是使用与原始表相同版本的表存储格式创建的。需要有原始表的SELECT权限。

LIKE仅适用于基表,不适用于视图。

  1. 不允许在已经执行了LOCK TABLES语句的会话中使用CREATE TABLECREATE TABLE ... LIKE
  2. CREATE TABLE ... LIKECREATE TABLE进行相同的检查,即操作是差不多的,只不过CREATE TABLE ... LIKE是根据原始表的表结构以及其他信息来创建表,确实还是CREATE TABLE。这意味着如果当前的 SQL 模式与创建原始表时生效的模式不同,则表定义可能被认为对新模式无效并导致语句失败。
  3. 对于CREATE TABLE ... LIKE,目标表保留原始表中生成的列信息。
  4. 对于CREATE TABLE ... LIKE,目标表保留原始表中的表达式默认值。
  5. 对于CREATE TABLE ... LIKE,目标表保留原始表的检查约束,除了生成所有约束名称。
  6. CREATE TABLE ... LIKE不保留为原始表指定的任何 DATA DIRECTORYINDEX DIRECTORY表选项或任何外键定义。
  7. 如果原始表是TEMPORARY表, CREATE TABLE ... LIKE则不保留 TEMPORARY, 要创建 TEMPORARY目标表,使用 CREATE TEMPORARY TABLE ... LIKE
  8. mysql表空间、 InnoDB系统表空间 ( innodb_system) 或通用表空间TABLESPACE中创建的表在表定义中包含一个属性,该属性定义了表所在的表空间。由于临时回归, 无论设置如何,CREATE TABLE ... LIKE都会保留TABLESPACE属性并在定义的表空间中创建表 innodb_file_per_table。为了在TABLESPACE基于此类表的定义创建空表时避免使用该属性,改用语法为:CREATE TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0;
  9. CREATE TABLE ... LIKE操作将原始表所有的ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE值应用于目标表。

这些规则不需要记住,遇到问题,再回来看看,如果发现错误,也感谢大家可以帮博主指正。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username)
)engine 'innodb' character set 'utf8mb4';

create table jack.kaven2 like jack.kaven;

在这里插入图片描述
[AS] query_expression

如果还需要将原始表的数据复制到目标表,可以在CREATE TABLE语句末尾添加一条SELECT语句:

CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;

不进行复制,目标表是空表。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username)
)engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k' , '123456') , ('j' , '1234567') , ('w' , '1234567890') , ('q' , '1234563210.');

create table jack.kaven2 like jack.kaven;
select * from jack.kaven2;

在这里插入图片描述
在这里插入图片描述
进行复制,目标表的数据和复制时原始表的数据是一样的。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username)
)engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k' , '123456') , ('j' , '1234567') , ('w' , '1234567890') , ('q' , '1234563210.');

create table jack.kaven2 as select * from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述
进行复制,但目标表只需要原始表中满足username字段包含字母k的行。

drop database if exists jack;
create database jack;
create table jack.kaven
(
    id       integer auto_increment,
    username varchar(128) not null,
    password varchar(256) not null,
    PRIMARY KEY PRIMARY_KEY (id),
    UNIQUE KEY UNI_USERNAME (username)
) engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password)
values ('k', '123456'),('kll', '1234567'),
       ('wqw', '1234567890'),('qsdd', '1234563210.'),
       ('qskd', '1234563210.');

create table jack.kaven2 as select * from jack.kaven where username like '%k%';
select * from jack.kaven2;

在这里插入图片描述

这里只是简单介绍一下,其实还有很多更加复制的操作,以后有机会再进行介绍。

IGNORE | REPLACE

IGNOREREPLACE 选项指示在复制表时如何处理使用SELECT语句复制重复唯一键值的行。

可以在SELECT语句中通过IGNOREREPLACE选项指示如何处理重复唯一键值的行。使用IGNORE,如果表中已经具有和新行相同唯一键值的行,新行将被丢弃。使用REPLACE,新行替换具有相同唯一键值的行。如果既不指定IGNORE也不指定REPLACE,重复的唯一键值会导致错误。

使用IGNORE进行复制。

drop database if exists jack;
create database jack;
create table jack.kaven
(
    id       integer auto_increment primary key ,
    username varchar(128) not null,
    password varchar(256) not null
) engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k', '123456'),('k', '1234567'),
       ('k', '1234567890'),('qsdd', '1234563210.'),
       ('qskd', '1234563210.');
create table jack.kaven2(
    id       integer auto_increment primary key ,
    username varchar(128) not null unique ,
    password varchar(256) not null
) ignore select username , password from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述
使用REPLACE进行复制。

drop database if exists jack;
create database jack;
create table jack.kaven
(
    id       integer auto_increment primary key ,
    username varchar(128) not null,
    password varchar(256) not null
) engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k', '123456'),('k', '1234567'),
       ('k', '1234567890'),('qsdd', '1234563210.'),
       ('qskd', '1234563210.');
create table jack.kaven2(
    id       integer auto_increment primary key ,
    username varchar(128) not null unique ,
    password varchar(256) not null
) replace select username , password from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述
如果既不指定IGNORE也不REPLACE指定,在出现重复的唯一键值会导致错误。

drop database if exists jack;
create database jack;
create table jack.kaven
(
    id       integer auto_increment primary key ,
    username varchar(128) not null,
    password varchar(256) not null
) engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k', '123456'),('k', '1234567'),
       ('k', '1234567890'),('qsdd', '1234563210.'),
       ('qskd', '1234563210.');
create table jack.kaven2(
    id       integer auto_increment primary key ,
    username varchar(128) not null unique ,
    password varchar(256) not null
) select username , password from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述

列数据类型和属性

每个表有4096列的硬限制,但给定表的最多有效列数可能会更少。

data_type

data_type表示列定义的数据类型,如intvarchartextdecimaltimestamp 等。

drop database if exists jack;
create database jack;
create table jack.kaven(
    id int auto_increment primary key ,
    username varchar(128) not null unique ,
    profile text ,
    money decimal(10 , 2) not null default 0 ,
    create_time timestamp default current_timestamp ,
    update_time timestamp default current_timestamp on update current_timestamp
) engine 'innodb' character set 'utf8mb4';

在这里插入图片描述
以后有机会再详细介绍Mysql 8中的数据类型,不然篇幅会很长。

NOT NULL | NULL

如果既未指定NULL也未指定NOT NULL,则将该列视为已指定NULL

MySQL 8.0中,只有InnoDBMyISAMMEMORY存储引擎支持在索引列可以有NULL值。在其他情况下,必须将索引列声明为NOT NULL,不然可能会导致错误。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null ,
  code varchar(32) ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username) ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password , code) values ('k' , '123456' , '123') , ('j' , '1234567' , null) ;

create table jack.kaven2 as select * from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述

DEFAULT

指定列的默认值,有些数据类型不允许指定默认值,要注意判别。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null ,
  code varchar(32) default 'code',
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username) ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k' , '123456');

create table jack.kaven2 as select * from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述
创建时的时间戳默认值,可以设置为当前的时间戳,更新时的时间戳默认值,也可以设置为当前的时间戳。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null ,
  code varchar(32) default 'code',
  create_time timestamp default current_timestamp ,
  update_time timestamp default current_timestamp on update current_timestamp ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username) ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password) values ('k' , '123456') , ('l' , '.0123456');

create table jack.kaven2 as select * from jack.kaven;
select * from jack.kaven2;

在这里插入图片描述

VISIBLE、INVISIBLE

指定列可见性。如果两个关键字都不存在,默认情况下是VISIBLE。一张表必须至少有一个可见列。尝试使所有列不可见会产生错误。

所有列不可见会产生错误(A table must have at least one visible column):

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment invisible ,
  username varchar(128) not null invisible ,
  password varchar(256) not null invisible ,
  code varchar(32) invisible ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username) ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

在这里插入图片描述

指定password字段不可见。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id integer auto_increment ,
  username varchar(128) not null ,
  password varchar(256) not null invisible ,
  code varchar(32)  ,
  PRIMARY KEY PRIMARY_KEY(id) ,
  UNIQUE KEY UNI_USERNAME(username) ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

insert into jack.kaven(username, password, code) values ('kaven' , '123' , '666') , ('jack' , '456' , '000') ,
                                                        ('king' , '789' , '555');
select * from jack.kaven;

在这里插入图片描述
VISIBLEINVISIBLE关键字是从MySQL 8.0.23才有的。在MySQL 8.0.23之前,所有列都是可见的。

AUTO_INCREMENT

整数或浮点数列可以具有附加属性AUTO_INCREMENT

浮点数列其实不推荐使用附加属性AUTO_INCREMENT,因为在未来的版本中会移除对FLOATDOUBLE关于附加属性AUTO_INCREMENT的支持,执行下面的SQL语句会出现警告(博主的Mysql版本是8.0.25)。

drop database if exists jack;
create database jack;
create table jack.kaven(
  money double auto_increment  primary key ,
  username varchar(128) not null  unique ,
  password varchar(256) not null ,
  code varchar(32)  ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';
insert into jack.kaven(username, password, code) value ('kaven' , '111' , '111');
insert into jack.kaven(money , username, password, code) values (10.9 , 'jack' , '222' , '222') , (11.6 , 'cookie' , '222' , '222');
insert into jack.kaven(username, password, code) value ('jojo' , '333' , '333');
insert into jack.kaven(money , username, password, code) value (13.4 , 'java' , '222' , '222');
insert into jack.kaven(username, password, code) values ('docker' , '333' , '333') , ('k8s' , '333' , '333');

select * from jack.kaven;

在这里插入图片描述
有如下警告:

[HY000][3856] AUTO_INCREMENT support for FLOAT/DOUBLE columns is deprecated and will be removed in a future release. Consider removing AUTO_INCREMENT from column ‘money’.

整数列使用附加属性AUTO_INCREMENT

drop database if exists jack;
create database jack;
create table jack.kaven(
  id int auto_increment  primary key ,
  username varchar(128) not null  unique ,
  password varchar(256) not null ,
  code varchar(32)  ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';
insert into jack.kaven(username, password, code) value ('kaven' , '111' , '111');
insert into jack.kaven(id , username, password, code) values (10 , 'jack' , '222' , '222') , (13 , 'cookie' , '222' , '222');
insert into jack.kaven(username, password, code) value ('jojo' , '333' , '333');
insert into jack.kaven(id , username, password, code) value (16 , 'java' , '222' , '222');
insert into jack.kaven(username, password, code) values ('docker' , '333' , '333') , ('k8s' , '333' , '333');

select * from jack.kaven;

在这里插入图片描述

每个表只能有一个AUTO_INCREMENT列,它必须被索引,并且不能有DEFAULT值。

如果有多个AUTO_INCREMENT列,会报错:[42000][1075] Incorrect table definition; there can be only one auto column and it must be defined as a key

drop database if exists jack;
create database jack;
create table jack.kaven(
  id int auto_increment  primary key ,
  code int auto_increment,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

在这里插入图片描述
如果AUTO_INCREMENT列没有被索引,会报错:[42000][1075] Incorrect table definition; there can be only one auto column and it must be defined as a key

drop database if exists jack;
create database jack;
create table jack.kaven(
  id int auto_increment ,
  code int,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

在这里插入图片描述
如果AUTO_INCREMENT列有DEFAULT值,会报错:[42000][1067] Invalid default value for 'id'

drop database if exists jack;
create database jack;
create table jack.kaven(
  code int default 1,
  id int auto_increment primary key default 1,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';

在这里插入图片描述

当将值NULL(推荐)或 0插入 AUTO_INCREMENT列时,该列将设置为下一个序列值。通常是value+1,其中value是表中当前列的最大值, AUTO_INCREMENT序列以1开始(从上面演示的效果也可知道)。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id int auto_increment  primary key ,
  username varchar(128) not null  unique ,
  password varchar(256) not null ,
  code varchar(32)  ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';
insert into jack.kaven(username, password, code) value ('kaven' , '111' , '111');
insert into jack.kaven(id , username, password, code) values (null , 'jack' , '222' , '222') , (0 , 'cookie' , '222' , '222');
insert into jack.kaven(username, password, code) value ('jojo' , '333' , '333');
insert into jack.kaven(id , username, password, code) value (null , 'java' , '222' , '222');
insert into jack.kaven(username, password, code) values ('docker' , '333' , '333') , ('k8s' , '333' , '333');

select * from jack.kaven;

在这里插入图片描述
插入负数也不会意外出现AUTO_INCREMENT列包含 0的情况。上面有说过,当将值NULL0插入 AUTO_INCREMENT列时,该列将设置为下一个序列值。通常是value+1,其中value是表中当前列的最大值,所以可以知道这个最大值不会是负数,不然就有可能出现AUTO_INCREMENT列包含 0的情况,和下面的实验结果矛盾。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id int auto_increment  primary key ,
  username varchar(128) not null  unique ,
  password varchar(256) not null ,
  code varchar(32)  ,
  INDEX CODE_INDEX(code)
)engine 'innodb' character set 'utf8mb4';
insert into jack.kaven(id , username, password, code) value (-1 , 'go' , '222' , '222') , (null , 'k8s' , '333' , '333');
insert into jack.kaven(username, password, code) value ('kaven' , '111' , '111');
insert into jack.kaven(id , username, password, code) values (-10 , 'jack' , '222' , '222') , (-0 , 'cookie' , '222' , '222');
insert into jack.kaven(username, password, code) value ('jojo' , '333' , '333');
insert into jack.kaven(id , username, password, code) value (-155 , 'java' , '222' , '222');
insert into jack.kaven(username, password, code) values ('docker' , '333' , '333');
select * from jack.kaven;

在这里插入图片描述

COMMENT

可以使用该COMMENT选项指定列的注释 ,最长为1024个字符。注释由SHOW CREATE TABLESHOW FULL COLUMNS语句显示。

drop database if exists jack;
create database jack;
create table jack.kaven(
  id int auto_increment  primary key comment '这是id , 每行数据唯一',
  username varchar(128) not null  unique comment '这是用户的用户名,也是唯一的',
  password varchar(256) not null comment '这是用户的密码',
  code varchar(32)  comment '这是用户的身份码',
  INDEX CODE_INDEX(code) comment '建立索引 ,方便通过用户的身份码来查询用户信息'
)engine 'innodb' character set 'utf8mb4';
show create table jack.kaven;
show full columns from jack.kaven;

在这里插入图片描述
在这里插入图片描述

不常用的属性就不介绍了,以后有需求会再进行补充。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值