分享

创建数据库

 afskd 2011-04-23
     
   1. 创建表:
  在SQL Server中,可以使用SQL语句或SQL企业管理器来创建数据库表。在创建表的时候最主要的工作是定义各列的数据类型及约束。
 (1) 用企业管理器创建表。
  展开企业管理器上的数据库节点,从中选择一个要建立表的数据库,在鼠标右键单击出来的快捷菜单中选择"新建",子菜单,选择"表"命令。如图4-11。

  
图4-11


  弹出窗口如图4-12。

  
图4-12


  在该窗口中,对表的内容进行定义:
  指定列名:在创建一个新列的时候,首先输入列名,列名在表中必须唯一,列的命名遵守SQL Server的数据库对象命名规则。
  指定数据类型:接下来选择该列的数据类型,这里有不同的数据类型,包括你创建的用户定义的数据类型,显示在"数据类型"下拉清单对话框中。其长度取决于你选择的数据类型。当然有些数据类型的长度,如char,可以进行改变。
  指定其他特性:在指定完某一列的数据类型之后,可以为每种数据类型指定附加特性--数据的长度和是否允许空等。如果一列允许空,则在输入数据的时候,可以省略输入该列的值。若定义了一列不允许空,则在输入数据的时候,必须输入该列的值。可以说,允许空实际上提供了一种数据的校验。
  对于INT,SMALLINT,TINYINT,NUMERIC(P,0)等数据类型可以指定为标识列(identity)特性。当用identity特性定义一个列,可以指定该列初始值和每次添加的增量。在往表中增加元组的时候,系统自动为该列赋值,第一行使用初始值,以后每一行增加增量。如果这一列允许为空,则不能指定为identity特性。
  设置主键:选择要建立主键的列,单击鼠标右键,选择"设置主键"即可。

  关闭和保存新建的表时,系统会弹出对话框让你输入该表的名称,如图4-13

图示 图4-13


 (2) 用SQL语句创建表:
  使用SQL创建表的语法如下:
   CREATE TABLE 表名
   ( <列名><数据类型> [<列级完整性约束条件>]
   [,<列名><数据类型> [<列级完整性约束条件>]]… [,取唯一值的列(列名[,列名]….)]
   [,关键字列(列名[,列名]…)]
   [,外部关键字列 (列名[,列名]…)
   引用的外部表名(列名[,列名]…)]
   [,< 表级完整性约束条件 >] );

   CREATE TABLE 表名
   (
   列名 数据类型[缺省值][NOT NULL]
   [,列名 数据类型[缺省值][NOT NULL]]….
   [,UNIQUE(列名[,列名]….)]
   [,PRIMARY KEY(列名[,列名]…)]
   [,FOREIGN KEY (列名[,列名]…)REFERENCES 表名(列名[,列名]…)]
   [,CKECK (条件)]
   )
  参数说明:缺省值(DEFAULT):指定列的缺省值;
  NOT NULL:列值不能为空值;
  UNIQUE:取值唯一的列名;
  PRIMARY KEY:主关键字(主码)列名;
  FOREIGN KEY:外部码列名;
  REFERENCES:引用的外部码的表名和列名
  CKECK :指定表级约束条件。

例题  例1,定义一个表DEPT,包括4列。其中deptno为主键。
 CREATE TABLE DEPT( deptno CHAR(8) NOT NULL,
 Deptname CHAR(20) NOT NULL,
 Deptphno CHAR(12),
 Deptadd CHAR(40)
 PRINARY KEY (deptno)
 )
例题
 例2,定义表student,包括5列,其中sno为主键,sclass为外键码,sclass为表classname的主键。Ppt37CREATE TABLE student( sno CHAR(8) NOT NULL,
  Sname CHAR(20) NOT NULL,
  Ssex CHAR(1),
  Sage INT,
  Sclass CHAR(8)
  PRINARY KEY (sno)FOREIGN KEY(sclass)
  REFERENCES class(classname)
  )
例题
 例3,产生表student,与例2基本相同,但需要通过check约束学生年龄大于等于14岁,如下定义。ppt38CREATE TABLE student( sno CHAR(8) NOT NULL,
  Sname CHAR(20) NOT NULL,
  Ssex CHAR(1),
  Sage INT CHECK (sage >= 14),
  Sclass CHAR(8)
  PRINARY KEY (sno)FOREIGN KEY(sclass)
  REFERENCES class(classname)
  )
例题
 例4,产生表couse,设计要求:开课系必须是已有的系,授课教师必须是本校的教师。CREATE TABLE couse
  (cno CHAR(6) NOT NULL,
  cname CHAR(20) NOT NULL,
  credit INT,
  cdept CHAR(8),
  ctno CHAR(8)
  )
 注意:例4产生的表不能满足设计要求,必须对该表进行修改,增加约束外部关键字约束说明,满足设计要求。

 (3). 在查询分析器中使用SQL语句建表如图4-14。

图示 图4-14

     
   1. 索引的创建:
  在SQL Server中,可以用企业管理器或用SQL语句完成索引的创建。
 (1) 使用企业管理器创建索引:
  在设计表格的时候,选择列的快捷菜单"属性",切换到"属性"页对表格的索引进行添加。如图4-19,在表student1为列sno中添加簇集索引IX_TABLE1。

  
图4-19


 (2) 使用SQL语句创建索引
  语法格式如下:
   CREATE [UNIQUE] [CLUSTER|NONCLUSTERED] INDEX index_name
   ON table_name(column_name[ASC/DISC]
   [,column_name[ASC/DISC]]….])
  参数说明:
   UNIQUE:表示创建的索引是唯一索引,每个索引只对应一个元组值。
   CLUSTERED:表示创建的索引是簇集索引。
   NONCLUSTERED:表示创建的索引是非簇集索引。
   Index_name:创建的索引名。
   Table_name:创建索引所在的表名。
   Column_name:创建索引使用的列名。由ntext、text或image数据类型组成的列不能指定为索引列。
   ASC|DESC:确定具体某个索引列的升序或降序排列。默认设置为ASC。
例题  例1,为TEACHER表建立唯一索引tnamex,升序排列。不管教师是否有重名,每个索引值只对应一个教师名字。
  CREATE UNIQUE INDEX tnamex ON TEACHER(tname)
例题
 例2,在SC表上按学号sno建立聚集索引scinx。
  CREATE CLUSTER INDEX scinx ON SC(sno)
 在选课表中建立聚集索引scinx之后,同一个学生的所有选课成绩记录物理地排在一起。所以,查询某个学生的学习成绩或打印某个学生的成绩单速度就比较快。如表4-3。

  表4-3
例题 例3:为student表建立索引,NONCLUSTERED为隐含值,可以省略。
    CREATE NONCLUSTERED INDEX stu_index ON student(sname)

 (3) 在两个或更多属性上建立索引:
  假如查询经常涉及到多个列值的检索条件,可在一个关系表上建立多个属性的索引,提高查询效率。否则会降低查询效率。
  例如,选课关系sc,主码(sno, cno),经常查询某学号的同学选修某课程的成绩。为两个属性建立索引的语句如下:
   CREATE INDEX Scidx ON sc(sno, cno);

 (4) 使用索引的原则:
   要不要建索引以及如何建索引,当属于内模式的概念,这是数据库设计中一个很重要的问题。设计人员要仔细考虑实际应用中修改与查询的频率,权衡建索引的利弊。例如,若一关系的经常性操作是数据的修改,则不宜建索引。但有些修改语句可能包含着查询操作。
  一般来说,建索引有几项参考原则:
 ● 值得建索引:记录有一定规模,而查询只局限于少数记录。
 ● 索引用得上:索引列在where子句中应频繁使用。先装数据,后建索引:对于大多数基本表,总是有一批初始数据需要装入。该原则是说,建立关系后,先将这些初始数据装入基表,然后再建索引,这样可加快初始数据的录入。如果建表时就建索引,那么在输入初始数据时,每插入一个记录都要维护一次索引。当然,索引早建晚建都是允许的。
 ● 在下列三种情况下,有必要建立簇索引:
 (1)查询语句中采用该字段作为排序列
  例如,我们经常执行下列语句:
   SELECT * FROM authors ORDER BY au_id
  这时候有必要考虑在该表格上建立以au_id为关键字的簇索引。
   CRATE CLUSTERED INDEX au_index On authors (au_id)

 (2)需要返回局部范围的大量数据
  例如,我们要做如下的查询:
   SELECT * FROM authors
   WHERE zip BETWEEN 94618 AND 96214
  这时就有必要在zip列上建立簇索引。
   CRATE CLUSTERED INDEX zip_index On authors (zip)

 (3)表格中某字段内容的重复性比较大例如,student表中dno(系号)一列有大量重复数据,当在dno列上建立了簇索引后,下面的连接查询速度会加快。
   SELECT * FROM student,dept
   WHERE student.dno=dept.dno
  对以上情况,建立簇索引会提高访问数据库的效率。建立簇索引的语句如下:
   CRATE CLUSTERED INDEX dept_index On student(dep_id)
  注意:当在同一表格中建立簇索引和非簇索引时,先建立簇索引后建非簇索引比较好。因为如先建非簇索引的话,当建立簇索引时,SQL Server会自动将非簇索引删除,然后重新建立非簇索引。每个表仅可以有一个簇索引,最多可以有249个非簇索引。它们均允许以一个或多个字段作为索引关键字(Index Key),但最多只能有16个字段。
  SQL Server只对那些能加快数据查询速度的索引才能被选用。如果利用索引检索还不如顺序扫描速度快,SQL Server仍用扫描方法检索数据。建立不能被采用的索引只会增加系统的负担,降低检索速度。因此,可利用性是建立索引的首要条件。
 
 

     
   2. 修改索引
  用ALTER INDEX可以将一个聚集索引改为一个非聚集索引,或将可以将一个非聚集索引改为一个聚集索引。缺省为非聚集索引。
  修改索引语句格式: ALTER INDEX 索引名 TO [NOT]CLUSTER
例题  例1,把tnamex改为一个聚集索引,该表的元组的物理位置要从新排列,原有的非聚集索引需要全部删除,而后重建。
   ALTER INDEX tnamex TO CLUSTER
例题
 例2,把scinx改为一个非聚集索引
   ALTER INDEX scinx TO NOT CLUSTER
 这里只介绍用SQL语句修改索引,使用企业管理器修改索引与添加索引大致相同,在此不再赘述。

 3.删除索引: 
  删除索引的语句格式:
   DROP INDEX table_name. index_name
  参数说明:
   Table_name:要删除索引所在的表。
   Index_name:要删除索引的名称。

  例如:将teacher表中的索引tnamex删除:
   DROP INDEX teacher.tnamex
  执行 DROP INDEX 后,将重新获得以前由索引占用的空间。此后可将该空间用于任何数据库对象。

 使用索引的一点说明:
 (1) 使用SQL语言,用户可以随时在基本表上建立索引、增加新索引、删除索引。用户根据具体应用环境需要的情况,可动态地调整索引结构,达到较高的查询性能。
 (2) 用户只能建立、修改和删除索引,不能在数据操作中引用索引,在数据操作执行中如何使用索引完全由系统决定。从而保证了增加和删除索引时不必修改应用程序,支持数据的物理独立性。
 (3)不能用DROP INDEX删除在系统表上的索引。
 (4) 若要删除为实现 PRIMARY KEY 或 UNIQUE 约束而创建的索引,必须先除去约束,因为许多DBMS系统自动为PRIMARY KEY和UNIQUE属性列建立索引。
 (5) 只有表的所有者和sysadmin有权删除表的索引。

 

 

 
     
   2. 修改表
  SQL语言提供对设计好的表进行补充和修改的功能,包括增加,修改和删除某些列等。在SQL Server中,可以使用SQL语句或SQL企业管理器来修改数据库表。
 (1) 使用企业管理器修改表格。
  从树形结构展开要修改定义的表所在数据库,并选中该数据库节点下面的表节点,在企业管理器右侧显示出该数据库下全部表格。选择要修改的表,单击鼠标右键,从弹出的快捷菜单中选择"设计表"命令,其余操作和最初建立表格时一样,如图4-15。

  
图4-15

 (2) 使用SQL语句修改表
  使用SQL语句,可以在更大范围修改表格。包括增加、删除、修改列定义或完整性约束条件,其格式:
   ALTER TABLE 表名
   [ADD子句]          增加新的列定义或列说明
   [ALTER COLUMN子句]     修改表中列定义或列说明
   [DROP子句]         删除表中的列或列说明
   [ADD CONSTRAINT子句]    增加约束
   
[DROP CONSTRAINT子句]    删除约束

例题  例1,修改表COUSE。上面的例4产生的表不能满足设计要求,必须对该表进行修改,增加约束外部关键字约束说明,满足设计要求,语句如下: ALTER TABLE COUSE
  ADD FOREIGN KEY (cdept) REFERENCES DEPT [deptno]
  ADD FOREIGN KEY (ctno) REFERENCES TEACHER [tno]
例题
 例2,修改学生的年龄为出生日期(日期类型)。
  ALTER TABLE STUDENT
  ALTER COLUMN sage DATETIME
例题
 例3:增加学生的电话属性:
  ALTER TABLE STUDENT
  ADD sphno CHAR(12)
例题  例4,增加学生的国家属性
  ALTER TABLE STUDENT
  ADD country CHAR(30)

 (3) 在查询分析器中修改表,修改结果如图4-16。

  图4-16

     
   ③用T-SQL语句创建数据库:
  用T-SQL语句创建数据库,可以在程序中使用,或在查询分析器中使用。语法格式如下:
   CREATE DATABASE database_name
    [ ON [PRIMARY]
    [ <filespec>[,…n] ][, <filegroup>[,…n] ] ][ LOG ON { <filespec> [,…n] } ]
    [ FOR LOAD ∣ FOR ATTACH ]

   <filespec>:: = (
    [ NAME = logical_file_name,]
    FILENAME = 'os_file_name'
    [,SIZE = size]
    [,MAXSIZE = {max_size|UNLIMITED}]
    [,FILEGROWTH = growth_increment]) [,…n]

   <filegroup>:: =
    FILEGROUP filegroup_name <filespec>[,…n]

  参数说明:
 · database_name
  新建数据库的名称。数据库名称在服务器中必须唯一,并且符合标识符的规则。database_name最多可以包含128个字符。如果没有指定日志文件的逻辑名,则SQL Server会通过向 database_name追加后缀来生成逻辑名。该操作要求database_name在123个字符之内,以便生成的日志文件逻辑名少于128个字符。
 · ON
  显式定义用来存储数据库数据部分的数据文件。该关键字后跟以逗号分隔的 <filespec> 项列表,<filespec> 项用以定义主文件组的数据文件。主文件组的文件列表后可跟以逗号分隔的 <filegroup> 项列表,<filegroup> 项用以定义用户文件组及其文件。
 · LOG ON
  显式定义用来存储数据库日志的磁盘文件(日志文件)。该关键字后跟以逗号分隔的 <filespec> 项列表,<filespec> 项用以定义日志文件。如果没有指定 LOG ON,将自动创建一个日志文件,它使用系统生成的名称,大小为数据库中所有数据文件总大小的25%。
 · FOR LOAD
  支持该子句是为了与早期版本的 SQL Server 兼容。表示将备份数据直接装入新建的数据库。但从SQL Server7.0开始就可以使用RESTORE语句完成相同的功能。
 · FOR ATTACH
  指定从现有的一组操作系统文件中建立数据库。必须有指定第一个主文件的 <filespec> 条目。
 · PRIMARY
  定义数据库的主数据文件。相应<filespec>列表的第一个<filespec>条目成为主数据文件,该文件包含数据库的逻辑起点及其系统表。一个数据库只能有一个主数据文件。如果没有指定PRIMARY,那么CREATE DATABASE语句中列出的第一个文件将成为主数据文件。
 · NAME
  为由<filespec>定义的文件指定逻辑名称。如果指定了FOR ATTACH,则不需要指定 NAME参数。
 · logical_file_name
  用来在创建数据库后执行的 Transact-SQL 语句中引用文件的名称。logical_file_name 在数据库中必须唯一,并且符合标识符的规则。
 · FILENAME
  为 <filespec> 定义的文件指定操作系统文件名。
 · 'os_file_name'
  操作系统创建 <filespec> 定义的物理文件时使用的路径名和文件名。os_file_name 中的路径必须指定 SQL Server 实例上的目录。os_file_name 不能指定压缩文件系统中的目录。
  如果文件在原始分区上创建,则 os_file_name 必须只指定现有原始分区的驱动器字母。每个原始分区上只能创建一个文件。原始分区上的文件不会自动增长;因此,os_file_name 指定原始分区时,不需要指定 MAXSIZE 和 FILEGROWTH 参数。
 · SIZE
  指定<filespec>中定义的文件的大小。如果主文件的<filespec>中没有提供SIZE参数,那么SQL Server将使用model数据库中的主文件大小。如果辅助文件或日志文件的 <filespec>中没有指定SIZE参数,则SQL Server将使文件大小为1MB。
 · size
  <filespec> 中定义的文件的初始大小。可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。指定一个整数,不要包含小数位。size 的最小值为 512 KB。如果没有指定 size,则默认值为 1 MB。为主文件指定的大小至少应与 model 数据库的主文件大小相同。
 · MAXSIZE
  指定 <filespec> 中定义的文件可以增长到的最大大小。
 · max_size
  <filespec> 中定义的文件可以增长到的最大大小。可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。指定一个整数,不要包含小数位。如果没有指定 max_size,那么文件将增长到磁盘变满为止。

  说明:在磁盘即将变满时,Windows NT 系统日志会警告 SQL Server 系统管理员。
 · UNLIMITED
  指定 <filespec> 中定义的文件将增长到磁盘变满为止。
 · FILEGROWTH
  指定 <filespec> 中定义的文件的增长增量。文件的 FILEGROWTH 设置不能超过 MAXSIZE 设置。
 · growth_increment
  每次需要新的空间时为文件添加的空间大小。指定一个整数,不要包含小数位。0 值表示不增长。该值可以 MB、KB、GB、TB 或百分比 (%) 为单位指定。如果未在数量后面指定 MB、KB 或 %,则默认值为 MB。如果指定 %,则增量大小为发生增长时文件大小的指定百分比。如果没有指定 FILEGROWTH,则默认值为1MB;
例题 例1,在查询分析器中创建数据库示例如图4-6,其中相应的c:\mssql\data目录一定要事先存在。创建数据库的T-SQL语句如下: 
 CREATE DATABASE my_libraryON PRIMARY( --数据主文件
 NAME = my_library_data, --逻辑文件名
 FILENAME ='c:\mssql\data\my_library.mdf', --数据主文件存储路径,操作系统文件名
 SIZE = 10 MB, --10 MB的主要数据库文件
 MAXSIZE = 15 MB, --最大容量15MB
 FILEGROWTH = 20 % ) --当主数据文件满了,自动增大20%的容量
 LOG ON( --日志文件
 NAME = my_library_log, --日志文件逻辑文件名
 FILENAME ='c:\mssql\data\my_library.ldf',
       --日志文件存储路径,操作系统文件名
 SIZE = 3 MB , --3MB的日志文件
 MAXSIZE = 5 MB , --最大容量5MB
 FILEGROWTH = 1 MB ) --当日志文件满了,自动增大1MB。

  图4-6 创建数据库

 

     
    在SQL中,最常用的向表格中添加数据的方法是使用INSERT语句。但是,用INSERT语句每次只能插入一个元组。用带子查询插入语句,一个次可以插入一个或多个元组。
 ● 插入一个元组的语句格式:
   INSERT INTO 表名[(列名[,列名]…)]
   VALUES(值[,值]…..)
  插入单个元组,按顺序在表名后给出表中每个列名,在VALUES后给出对应的每个列值。插入一个完整的新元组时,可省略表的列名。插入部分列值,必须在表名后给出要输入值的列名。
例题  例1,插入单个元组,按顺序给出表中每个列值。
  INSERT INTO DEPT VALUES( "CS","计算机","888", "10区" )
例题
 例2,插入一个学生的部分列值,必须在表名后给出要输入值的列名。
  INSERT INTO STUDENT (sno ,sname)
  VALUES( "J20045", "刘琉")

  在使用INSERT语句的时候,VALUES列表中的值或表达式必须匹配表中的列数,并和相应各列数据类型兼容。如果表格中存在某些列定义为NOT NULL,那么在插入时该列必须要出现在VALUES的列表中,否则插入会失败。

 ● 用子查询插入多个元组值的语句格式:
   INSERT INTO 表名[(列名[,列名]…)]
  子查询
  注意:在使用子查询的结果插入元组时,子查询的结果必须匹配待插入表中的列数,并和相应各列数据类型兼容。如果表格中存在某些列定义为NOT NULL,那么子查询的结果在该列上必须有值,否则插入会失败。
例题  例3,建立一个新表,存放每个学生的学号、姓名和平均成绩。把子查询结果插入新表中。
  CREATE TABLE savg( sno CHAR(8),sname CHAR(20), avage REAL )
  INSERT INTO savg (sno,sname,avage)
  ( SELECT sno,sname,AVG(grade)
  FROM SC,STUDENT
  WHERE SC.sno = STUDENT.sno
  GROUP BY sno )
例题
 例4,在表Studio中插入属性name,这些name是在表Movie中提到,但没有在表Studio中出现的studioName。
  INSERT INTO Studio(name)
  SELECT DISTINCT studioName
  FROM Movie
  WHERE studioName NOT IN
  (SELECT name FROM Studio);

  考虑上述例子如果去掉DISTINCT会是什么样子?和你想象的一样吗?
     
    在SQL中,最常用的向表格中添加数据的方法是使用INSERT语句。但是,用INSERT语句每次只能插入一个元组。用带子查询插入语句,一个次可以插入一个或多个元组。
 ● 插入一个元组的语句格式:
   INSERT INTO 表名[(列名[,列名]…)]
   VALUES(值[,值]…..)
  插入单个元组,按顺序在表名后给出表中每个列名,在VALUES后给出对应的每个列值。插入一个完整的新元组时,可省略表的列名。插入部分列值,必须在表名后给出要输入值的列名。
例题  例1,插入单个元组,按顺序给出表中每个列值。
  INSERT INTO DEPT VALUES( "CS","计算机","888", "10区" )
例题
 例2,插入一个学生的部分列值,必须在表名后给出要输入值的列名。
  INSERT INTO STUDENT (sno ,sname)
  VALUES( "J20045", "刘琉")

  在使用INSERT语句的时候,VALUES列表中的值或表达式必须匹配表中的列数,并和相应各列数据类型兼容。如果表格中存在某些列定义为NOT NULL,那么在插入时该列必须要出现在VALUES的列表中,否则插入会失败。

 ● 用子查询插入多个元组值的语句格式:
   INSERT INTO 表名[(列名[,列名]…)]
  子查询
  注意:在使用子查询的结果插入元组时,子查询的结果必须匹配待插入表中的列数,并和相应各列数据类型兼容。如果表格中存在某些列定义为NOT NULL,那么子查询的结果在该列上必须有值,否则插入会失败。
例题  例3,建立一个新表,存放每个学生的学号、姓名和平均成绩。把子查询结果插入新表中。
  CREATE TABLE savg( sno CHAR(8),sname CHAR(20), avage REAL )
  INSERT INTO savg (sno,sname,avage)
  ( SELECT sno,sname,AVG(grade)
  FROM SC,STUDENT
  WHERE SC.sno = STUDENT.sno
  GROUP BY sno )
例题
 例4,在表Studio中插入属性name,这些name是在表Movie中提到,但没有在表Studio中出现的studioName。
  INSERT INTO Studio(name)
  SELECT DISTINCT studioName
  FROM Movie
  WHERE studioName NOT IN
  (SELECT name FROM Studio);

  考虑上述例子如果去掉DISTINCT会是什么样子?和你想象的一样吗?
 
     
    DELETE 语句从表中删除一个或多个满足条件的元组。语句格式:
  DELETE FROM 表名 [WHERE 条件表达式]
  WHERE子句中的条件表达式给出被删除元组应满足的条件;若不写WHERE子句,表示删除表中的所有元组,但表的定义仍存在。
例题  例1,只涉及单个元组,从数据库中删除某个学生李楷:
   DELETE FROM STUDENT
   WHERE sname = "李楷"
例题
 例2,删除操作涉及多个元组,从数据库中删除某门课程的所有元组:
   DELETE FROM SC
   WHERE cno = "E001"
 
 
 

 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多