MySQL四-2:完整性约束
阅读目录
- 一 介绍
- 二 not null与default
- 三 unique
- 四 primary key
- 五 auto_increment
- 六 foreign key
- 七 作业
一 介绍
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
- PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
- FOREIGN KEY (FK) 标识该字段为该表的外键
- NOT NULL 标识该字段不能为空
- UNIQUE KEY (UK) 标识该字段的值是唯一的
- AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
- DEFAULT 为该字段设置默认值
- UNSIGNED 无符号
- ZEROFILL 使用0填充
说明:
- 1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
- 2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
- sex enum('male','female') not null default 'male'
- age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
- 3. 是否是key
- 主键 primary key
- 外键 foreign key
- 索引 (index,unique...)
是否可空,null表示空,非字符串
not null - 不可空
null - 可空
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table tb1(
nid int not null defalut 2,
num int not null)
- ==================not null====================
- mysql> create table t1(id int); #id字段默认可以插入空
- mysql> desc t1;
- +-------+---------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+---------+------+-----+---------+-------+
- | id | int(11) | YES | | NULL | |
- +-------+---------+------+-----+---------+-------+
- mysql> insert into t1 values(); #可以插入空
- mysql> create table t2(id int not null); #设置字段id不为空
- mysql> desc t2;
- +-------+---------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+---------+------+-----+---------+-------+
- | id | int(11) | NO | | NULL | |
- +-------+---------+------+-----+---------+-------+
- mysql> insert into t2 values(); #不能插入空
- ERROR 1364 (HY000): Field 'id' doesn't have a default value
- ==================default====================
- #设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
- mysql> create table t3(id int default 1);
- mysql> alter table t3 modify id int not null default 1;
- ==================综合练习====================
- mysql> create table student(
- -> name varchar(20) not null,
- -> age int(3) unsigned not null default 18,
- -> sex enum('male','female') default 'male',
- -> hobby set('play','study','read','music') default 'play,music'
- -> );
- mysql> desc student;
- +-------+------------------------------------+------+-----+------------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+------------------------------------+------+-----+------------+-------+
- | name | varchar(20) | NO | | NULL | |
- | age | int(3) unsigned | NO | | 18 | |
- | sex | enum('male','female') | YES | | male | |
- | hobby | set('play','study','read','music') | YES | | play,music | |
- +-------+------------------------------------+------+-----+------------+-------+
- mysql> insert into student(name) values('egon');
- mysql> select * from student;
- +------+-----+------+------------+
- | name | age | sex | hobby |
- +------+-----+------+------------+
- | egon | 18 | male | play,music |
- +------+-----+------+------------+
验证
三 unique
- ============设置唯一约束 UNIQUE===============
- 方法一:
- create table department1(
- id int,
- name varchar(20) unique,
- comment varchar(100)
- );
- 方法二:
- create table department2(
- id int,
- name varchar(20),
- comment varchar(100),
- constraint uk_name unique(name)
- );
- mysql> insert into department1 values(1,'IT','技术');
- Query OK, 1 row affected (0.00 sec)
- mysql> insert into department1 values(1,'IT','技术');
- ERROR 1062 (23000): Duplicate entry 'IT' for key 'name'
- mysql> create table t1(id int not null unique);
- Query OK, 0 rows affected (0.02 sec)
- mysql> desc t1;
- +-------+---------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+---------+------+-----+---------+-------+
- | id | int(11) | NO | PRI | NULL | |
- +-------+---------+------+-----+---------+-------+
- row in set (0.00 sec)
not null+unique的化学反应
- create table service(
- id int primary key auto_increment,
- name varchar(20),
- host varchar(15) not null,
- port int not null,
- unique(host,port) #联合唯一
- );
- mysql> insert into service values
- -> (1,'nginx','192.168.0.10',80),
- -> (2,'haproxy','192.168.0.20',80),
- -> (3,'mysql','192.168.0.30',3306)
- -> ;
- Query OK, 3 rows affected (0.01 sec)
- Records: 3 Duplicates: 0 Warnings: 0
- mysql> insert into service(name,host,port) values('nginx','192.168.0.10',80);
- ERROR 1062 (23000): Duplicate entry '192.168.0.10-80' for key 'host'
联合唯一
四 primary key
primary key字段的值不为空且唯一
一个表中可以:
单列做主键
多列做主键(复合主键)
但一个表内只能有一个主键primary key
- ============单列做主键===============
- #方法一:not null+unique
- create table department1(
- id int not null unique, #主键
- name varchar(20) not null unique,
- comment varchar(100)
- );
- mysql> desc department1;
- +---------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +---------+--------------+------+-----+---------+-------+
- | id | int(11) | NO | PRI | NULL | |
- | name | varchar(20) | NO | UNI | NULL | |
- | comment | varchar(100) | YES | | NULL | |
- +---------+--------------+------+-----+---------+-------+
- rows in set (0.01 sec)
- #方法二:在某一个字段后用primary key
- create table department2(
- id int primary key, #主键
- name varchar(20),
- comment varchar(100)
- );
- mysql> desc department2;
- +---------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +---------+--------------+------+-----+---------+-------+
- | id | int(11) | NO | PRI | NULL | |
- | name | varchar(20) | YES | | NULL | |
- | comment | varchar(100) | YES | | NULL | |
- +---------+--------------+------+-----+---------+-------+
- rows in set (0.00 sec)
- #方法三:在所有字段后单独定义primary key
- create table department3(
- id int,
- name varchar(20),
- comment varchar(100),
- constraint pk_name primary key(id); #创建主键并为其命名pk_name
- mysql> desc department3;
- +---------+--------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +---------+--------------+------+-----+---------+-------+
- | id | int(11) | NO | PRI | NULL | |
- | name | varchar(20) | YES | | NULL | |
- | comment | varchar(100) | YES | | NULL | |
- +---------+--------------+------+-----+---------+-------+
- rows in set (0.01 sec)
单列主键
- ==================多列做主键================
- create table service(
- ip varchar(15),
- port char(5),
- service_name varchar(10) not null,
- primary key(ip,port)
- );
- mysql> desc service;
- +--------------+-------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------------+-------------+------+-----+---------+-------+
- | ip | varchar(15) | NO | PRI | NULL | |
- | port | char(5) | NO | PRI | NULL | |
- | service_name | varchar(10) | NO | | NULL | |
- +--------------+-------------+------+-----+---------+-------+
- rows in set (0.00 sec)
- mysql> insert into service values
- -> ('172.16.45.10','','mysqld'),
- -> ('172.16.45.11','','mariadb')
- -> ;
- Query OK, 2 rows affected (0.00 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- mysql> insert into service values ('172.16.45.10','','nginx');
- ERROR 1062 (23000): Duplicate entry '172.16.45.10-3306' for key 'PRIMARY'
多列主键
五 auto_increment
约束字段为自动增长,被约束的字段必须同时被key约束
- #不指定id,则自动增长
- create table student(
- id int primary key auto_increment,
- name varchar(20),
- sex enum('male','female') default 'male'
- );
- mysql> desc student;
- +-------+-----------------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+-----------------------+------+-----+---------+----------------+
- | id | int(11) | NO | PRI | NULL | auto_increment |
- | name | varchar(20) | YES | | NULL | |
- | sex | enum('male','female') | YES | | male | |
- +-------+-----------------------+------+-----+---------+----------------+
- mysql> insert into student(name) values
- -> ('egon'),
- -> ('alex')
- -> ;
- mysql> select * from student;
- +----+------+------+
- | id | name | sex |
- +----+------+------+
- | 1 | egon | male |
- | 2 | alex | male |
- +----+------+------+
- #也可以指定id
- mysql> insert into student values(4,'asb','female');
- Query OK, 1 row affected (0.00 sec)
- mysql> insert into student values(7,'wsb','female');
- Query OK, 1 row affected (0.00 sec)
- mysql> select * from student;
- +----+------+--------+
- | id | name | sex |
- +----+------+--------+
- | 1 | egon | male |
- | 2 | alex | male |
- | 4 | asb | female |
- | 7 | wsb | female |
- +----+------+--------+
- #对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
- mysql> delete from student;
- Query OK, 4 rows affected (0.00 sec)
- mysql> select * from student;
- Empty set (0.00 sec)
- mysql> insert into student(name) values('ysb');
- mysql> select * from student;
- +----+------+------+
- | id | name | sex |
- +----+------+------+
- | 8 | ysb | male |
- +----+------+------+
- #应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它
- mysql> truncate student;
- Query OK, 0 rows affected (0.01 sec)
- mysql> insert into student(name) values('egon');
- Query OK, 1 row affected (0.01 sec)
- mysql> select * from student;
- +----+------+------+
- | id | name | sex |
- +----+------+------+
- | 1 | egon | male |
- +----+------+------+
- row in set (0.00 sec)
- #在创建完表后,修改自增字段的起始值
- mysql> create table student(
- -> id int primary key auto_increment,
- -> name varchar(20),
- -> sex enum('male','female') default 'male'
- -> );
- mysql> alter table student auto_increment=3;
- mysql> show create table student;
- .......
- ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
- mysql> insert into student(name) values('egon');
- Query OK, 1 row affected (0.01 sec)
- mysql> select * from student;
- +----+------+------+
- | id | name | sex |
- +----+------+------+
- | 3 | egon | male |
- +----+------+------+
- row in set (0.00 sec)
- mysql> show create table student;
- .......
- ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
- #也可以创建表时指定auto_increment的初始值,注意初始值的设置为表选项,应该放到括号外
- create table student(
- id int primary key auto_increment,
- name varchar(20),
- sex enum('male','female') default 'male'
- )auto_increment=3;
- #设置步长
- sqlserver:自增步长
- 基于表级别
- create table t1(
- id int。。。
- )engine=innodb,auto_increment=2 步长=2 default charset=utf8
- mysql自增的步长:
- show session variables like 'auto_inc%';
- #基于会话级别
- set session auth_increment_increment=2 #修改会话级别的步长
- #基于全局级别的
- set global auth_increment_increment=2 #修改全局级别的步长(所有会话都生效)
- #!!!注意了注意了注意了!!!
- If the value of auto_increment_offset is greater than that of auto_increment_increment, the value of auto_increment_offset is ignored.
- 翻译:如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略
- 比如:设置auto_increment_offset=3,auto_increment_increment=2
- mysql> set global auto_increment_increment=5;
- Query OK, 0 rows affected (0.00 sec)
- mysql> set global auto_increment_offset=3;
- Query OK, 0 rows affected (0.00 sec)
- mysql> show variables like 'auto_incre%'; #需要退出重新登录
- +--------------------------+-------+
- | Variable_name | Value |
- +--------------------------+-------+
- | auto_increment_increment | 1 |
- | auto_increment_offset | 1 |
- +--------------------------+-------+
- create table student(
- id int primary key auto_increment,
- name varchar(20),
- sex enum('male','female') default 'male'
- );
- mysql> insert into student(name) values('egon1'),('egon2'),('egon3');
- mysql> select * from student;
- +----+-------+------+
- | id | name | sex |
- +----+-------+------+
- | 3 | egon1 | male |
- | 8 | egon2 | male |
- | 13 | egon3 | male |
- +----+-------+------+
步长increment与起始偏移量offset:auto_increment_increment,auto_increment_offset
六 foreign key
员工信息表有三个字段:工号 姓名 部门
公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费
解决方法:
我们完全可以定义一个部门表
然后让员工信息表关联该表,如何关联,即foreign key
- #表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一
- create table department(
- id int primary key,
- name varchar(20) not null
- )engine=innodb;
- #dpt_id外键,关联父表(department主键id),同步更新,同步删除
- create table employee(
- id int primary key,
- name varchar(20) not null,
- dpt_id int,
- constraint fk_name foreign key(dpt_id)
- references department(id)
- on delete cascade
- on update cascade
- )engine=innodb;
- #先往父表department中插入记录
- insert into department values
- (1,'欧德博爱技术有限事业部'),
- (2,'艾利克斯人力资源部'),
- (3,'销售部');
- #再往子表employee中插入记录
- insert into employee values
- (1,'egon',1),
- (2,'alex1',2),
- (3,'alex2',2),
- (4,'alex3',2),
- (5,'李坦克',3),
- (6,'刘飞机',3),
- (7,'张火箭',3),
- (8,'林子弹',3),
- (9,'加特林',3)
- ;
- #删父表department,子表employee中对应的记录跟着删
- mysql> delete from department where id=3;
- mysql> select * from employee;
- +----+-------+--------+
- | id | name | dpt_id |
- +----+-------+--------+
- | 1 | egon | 1 |
- | 2 | alex1 | 2 |
- | 3 | alex2 | 2 |
- | 4 | alex3 | 2 |
- +----+-------+--------+
- #更新父表department,子表employee中对应的记录跟着改
- mysql> update department set id=22222 where id=2;
- mysql> select * from employee;
- +----+-------+--------+
- | id | name | dpt_id |
- +----+-------+--------+
- | 1 | egon | 1 |
- | 3 | alex2 | 22222 |
- | 4 | alex3 | 22222 |
- | 5 | alex1 | 22222 |
- +----+-------+--------+
示范
- 表1 foreign key 表2
- 则表1的多条记录对应表2的一条记录,即多对一
- 利用foreign key的原理我们可以制作两张表的多对多,一对一关系
- 多对多:
- 表1的多条记录可以对应表2的一条记录
- 表2的多条记录也可以对应表1的一条记录
- 一对一:
- 表1的一条记录唯一对应表2的一条记录,反之亦然
- 分析时,我们先从按照上面的基本原理去套,然后再翻译成真实的意义,就很好理解了
辅助理解
- #一对多或称为多对一
- 三张表:出版社,作者信息,书
- 一对多(或多对一):一个出版社可以出版多本书
- 关联方式:foreign key
- =====================多对一=====================
- create table press(
- id int primary key auto_increment,
- name varchar(20)
- );
- create table book(
- id int primary key auto_increment,
- name varchar(20),
- press_id int not null,
- foreign key(press_id) references press(id)
- on delete cascade
- on update cascade
- );
- insert into press(name) values
- ('北京工业地雷出版社'),
- ('人民音乐不好听出版社'),
- ('知识产权没有用出版社')
- ;
- insert into book(name,press_id) values
- ('九阳神功',1),
- ('九阴真经',2),
- ('九阴白骨爪',2),
- ('独孤九剑',3),
- ('降龙十巴掌',2),
- ('葵花宝典',3);
- 单张表:用户表+相亲关系表,相当于:用户表+相亲关系表+用户表
- 多张表:用户表+用户与主机关系表+主机表
- 中间那一张存放关系的表,对外关联的字段可以联合唯一
其它例子
- #一对一
- 两张表:学生表和客户表
- 一对一:一个学生是一个客户,一个客户有可能变成一个学校,即一对一的关系
- 关联方式:foreign key+unique
- 例一:一个用户只有一个博客
- 用户表:
- id name
- egon
- alex
- wupeiqi
- 博客表
- fk+unique
- id url name_id
- xxxx 1
- yyyy 3
- zzz 2
- 例二:一个管理员唯一对应一个用户
- 用户表:
- id user password
- egon xxxx
- alex yyyy
- 管理员表:
- fk+unique
- id user_id password
- 1 xxxxx
- 2 yyyyy
其他例子
七 作业
练习:账号信息表,用户组,主机表,主机组
- #用户表
- create table user(
- id int not null unique auto_increment,
- username varchar(20) not null,
- password varchar(50) not null,
- primary key(username,password)
- );
- insert into user(username,password) values
- ('root',''),
- ('egon',''),
- ('alex','alex3714')
- ;
- #用户组表
- create table usergroup(
- id int primary key auto_increment,
- groupname varchar(20) not null unique
- );
- insert into usergroup(groupname) values
- ('IT'),
- ('Sale'),
- ('Finance'),
- ('boss')
- ;
- #主机表
- create table host(
- id int primary key auto_increment,
- ip char(15) not null unique default '127.0.0.1'
- );
- insert into host(ip) values
- ('172.16.45.2'),
- ('172.16.31.10'),
- ('172.16.45.3'),
- ('172.16.31.11'),
- ('172.10.45.3'),
- ('172.10.45.4'),
- ('172.10.45.5'),
- ('192.168.1.20'),
- ('192.168.1.21'),
- ('192.168.1.22'),
- ('192.168.2.23'),
- ('192.168.2.223'),
- ('192.168.2.24'),
- ('192.168.3.22'),
- ('192.168.3.23'),
- ('192.168.3.24')
- ;
- #业务线表
- create table business(
- id int primary key auto_increment,
- business varchar(20) not null unique
- );
- insert into business(business) values
- ('轻松贷'),
- ('随便花'),
- ('大富翁'),
- ('穷一生')
- ;
- #建关系:user与usergroup
- create table user2usergroup(
- id int not null unique auto_increment,
- user_id int not null,
- group_id int not null,
- primary key(user_id,group_id),
- foreign key(user_id) references user(id),
- foreign key(group_id) references usergroup(id)
- );
- insert into user2usergroup(user_id,group_id) values
- (1,1),
- (1,2),
- (1,3),
- (1,4),
- (2,3),
- (2,4),
- (3,4)
- ;
- #建关系:host与business
- create table host2business(
- id int not null unique auto_increment,
- host_id int not null,
- business_id int not null,
- primary key(host_id,business_id),
- foreign key(host_id) references host(id),
- foreign key(business_id) references business(id)
- );
- insert into host2business(host_id,business_id) values
- (1,1),
- (1,2),
- (1,3),
- (2,2),
- (2,3),
- (3,4)
- ;
- #建关系:user与host
- create table user2host(
- id int not null unique auto_increment,
- user_id int not null,
- host_id int not null,
- primary key(user_id,host_id),
- foreign key(user_id) references user(id),
- foreign key(host_id) references host(id)
- );
- insert into user2host(user_id,host_id) values
- (1,1),
- (1,2),
- (1,3),
- (1,4),
- (1,5),
- (1,6),
- (1,7),
- (1,8),
- (1,9),
- (1,10),
- (1,11),
- (1,12),
- (1,13),
- (1,14),
- (1,15),
- (1,16),
- (2,2),
- (2,3),
- (2,4),
- (2,5),
- (3,10),
- (3,11),
- (3,12);
作业:
MySQL四-2:完整性约束的更多相关文章
- 三.mysql表的完整性约束
mysql表的完整性约束 什么是约束 not null 不能为空的 unique 唯一 = 不能重复 primary key 主键 = 不能为空 且 不能重复 foreign key ...
- mysql 四 表操作
表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 本节重点: 1 创建 ...
- MySQL四:表操作
阅读目录 表介绍 一 创建表 二 查看表结构 三 数据类型 四 表完整性约束 五 修改表ALTER TABLE 六 复制表 七 删除表 八 完整性约束 九 数据类型 表介绍 表相当于文件,表中的一条记 ...
- MySQL中的完整性约束
对于已经创建好的表,虽然字段的数据类型决定所能存储的数据类型,但是表中所存储的数据是否合法并没有检查. MySQL支持的完整性约束: NOT NULL 约束字段的值不能 ...
- Mysql 四种事务隔离介绍以及锁机制
还有很多不太懂,这里收集几份大佬文章“飞机票”,待我整理好了,再好好写一篇文章吧. MySQL的四种事务隔离级别 https://www.cnblogs.com/huanongying/p/70215 ...
- MySQL四种事务隔离级别详解
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- mysql三-3:完整性约束
一.完整性约束介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIG ...
- 百万年薪python之路 -- MySQL数据库之 完整性约束
MySQL完整性约束 一. 介绍 为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数 ...
- Mysql 四种事务隔离级别
一.前提 时过一年重新拾起博文记录,希望后面都能坚持下来. 接着之前MySql的学习,先记录下这篇. 以下都是基于mysql8 innodb存储引擎进行分析的. 二.事务的ACID特性 A(Atomi ...
随机推荐
- 天梯L2-003-测试点
测试点3无法过,题目说是正整数用了int,结果得用double输入才能AC.
- Xamarin XAML语言教程使用Progress属性数据绑定设置进度条进度
Xamarin XAML语言教程使用Progress属性数据绑定设置进度条进度 开发者除了可以为ProgressBar定义的Progress属性直接赋双精度类型的值外,还可以通过数据绑定的方式为该属性 ...
- Beginning iOS 8 Programming with Swift-TableView
UITableView控件使用 使用UITableView,在控件库中,拖拽一个Table View到ViewController中,在Controller的后台代码中需要继承UITableViewD ...
- iOS duplicate symbol for architecture arm64 解决办法
导致这个问题的原因有多种: 1.重复定义了const常量. 2.多个第三方库同时用到了某个函数库. 暂时列举这几种,以后遇到了其他原因再加.
- A Beginner’s Guide to the OUTPUT Clause in SQL Server
原文 A Beginner’s Guide to the OUTPUT Clause in SQL Server T-SQL supports the OUTPUT clause after the ...
- ife2015-task2-1-2-3
task2-1.html <!DOCTYPE html><html><head lang="en"> <meta charset=&quo ...
- espresso 元素遮挡问题。
在使用espresso进行测试的时候,点击一个横向列表的时候会在点击的项目下出现对应的横线. 实现方式是在FrameLayout下放两个TextView, 一个TextView包含下划线,默认是Fra ...
- JComboBox添加item的赋值类型问题!不一致的话会导致不能更改jcombobox的选择值
在用swing做页面的时候,往往需要设置字体样式,那么,如何用一种方法设置字体之后,在后面的其他页面就不需要再次设置字体了呢? 下面这个方法就可以解决了: JComboBox在对它进行添加子项的时候, ...
- session的作用范围(转)
session是在服务器端建立的,浏览器访问服务器会有一个jsessionid,浏览器端通过 jsessionid定位服务器端的session,session的创建和销毁由服务器端控制.当浏览器关闭后 ...
- Kwickserver
Kwickserver 欢迎来到Kwickserver的主页 Kwickserver是什么? Kwickserver是一个易于安装的和易于使用的服务器应用程序,从CD安装在PC兼容的硬件和坚持webi ...