精华内容
下载资源
问答
  • 一个表可以多少个 是否允许组合 主键 √ × 至多有1个 √,但不推荐 唯一 √ √ 可以有多个 √,但不推荐 唯一的性质表现在,相同列有两个null值都是错误的。   ...

    一、主键和唯一的区别:

      保证唯一性 是否允许为空 一个表可以有多少个 是否允许组合
    主键 × 至多有1个

    √,但不推荐

    唯一 可以有多个 √,但不推荐

    唯一的性质表现在,相同列中有两个null值都是错误的。

     

    二、外键:

    1、要求在从表设置外键关系

    2、从表的外键列的类型和主表的关联列(对应列)的类型要求一致或兼容,名称无要求

    3、主表中的关联列必须是一个key(一般是主键或者是唯一)

    4、要求插入数据时,先插入主表的数据,再插入从表数据;而删除数据时,先删除从表数据,再删除主表数据

     

    三、修改表时添加约束

    1、添加列级约束的时候,语法:

    ALTER   TABLE   表名   MODIFY    COLUMN    字段名    字段类型    新约束;

    2、添加表级约束,语法:

    ALTER   TABLE   表名  ADD   【CONSTRAINT   约束名】   约束类型(字段名)   【外键的引用】;

    -- 创建一个表
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE stuinfo(
        id INT,
        stuname VARCHAR(20),
        gender CHAR(1),
        seat INT,
        age INT,
        majorid INT
    )
    
    -- 添加非空约束
    ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
    
    -- 添加默认约束
    ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
    
    - 添加主键
    ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
    ALTER TABLE stuinfo ADD PRIMARY KEY(id);
    
    -- 添加唯一键
    ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
    ALTER TABLE stuinfo ADD UNIQUE(seat);
    
    -- 添加外键
    ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);

    四、修改表时删除约束

    -- 删除非空约束
    ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
    
    -- 删除默认约束
    ALTER TABLE stuinfo MODIFY COLUMN age INT;
    - 删除主键
    ALTER TABLE stuinfo DROP PRIMARY KEY;
    
    -- 删除唯一键
    ALTER TABLE stuinfo DROP INDEX seat;
    
    -- 删除外键
    ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

    五、列级约束和表级约束的区别

      位置 支持的约束类型 是否可以起约束名
    列级约束 列的后面 语法都支持,但外键没有效果 不可以
    表级约束 所有列的下面 默认和非空不支持,其他支持 可以

    六、标识列

    1、含义:又称为自增长列,可以不用手动的插入值,系统提供默认的序列值

    -- 创建表时设置标识列
    CREATE TABLE tab_identity(
        id INT PRIMARY KEY AUTO_INCREMENT;
        NAME VARCHAR(20)
    )
    INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
    INSERT INTO tab_identity(NAME) VALUES('lucy');
    
    

    2、可以设置步长,但MySQL不支持设置偏移量

    SET auto_increment_increment=3

    3、特点:

    (1)问:标识列必须和主键搭配吗?

              答:不一定,但要求是一个key(包括主键、唯一、外键或者自定义一个key)。

    (2)问:一个表可以有几个标识列?

              答:至多一个。

    (3)问:标识列的类型有哪些?

              答:只能是数值型(int\float\double...都可以,一般是int)。

    (4)可以通过手动插入值,设置起始值

    -- 可以使用这样的操作,设置起始值
    INSERT INTO tab_identity(id,NAME) VALUES(10,'john');

    (5)修改表时设置标识列

    -- 修改表时设置标识列
    ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

    (6)修改表时删除标识列

    -- 修改表时删除标识列
    ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;

     

    展开全文
  • 之前用Hibernate映射的...当然不是,可以通过设置复合主键的方式来处理,当然企业环境开发,所有的肯定是有主键的,这里只是做一个记录,好了 废话不多少了,开始吧! 本人用的工具开发工具是IDEA+Hibernate4.x...

          之前用Hibernate映射的表一直都有主键,刚好今天测试的是一张无主键的表,一直报错无法匹配,查了半天原来Hibernate是一定要设置主键了,但是是不是不设置主键就没法处理了?当然不是,可以通过设置复合主键的方式来处理,当然企业环境开发中,所有的表肯定是有主键的,这里只是做一个记录,好了  废话不多少了,开始吧!

         本人用的工具开发工具是IDEA+Hibernate4.x+sqlserver,其中涉及到的文件有EmpEntity.java,EmpEntity.hbm.xml,hibernate.cfg.xml

    这个三个文件都可以自动生成,这里就不截图了哈,如果不会的同志可以留言,下面分别贴下这三个文件

    1、EmpEntity.hbm.xml
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <!--无主键处理方法-->
        <class name="springtest.hibernate.EmpEntity" table="emp" schema="dbo" catalog="model">
            <composite-id>
                <key-property name="empno" column="empno"></key-property>
                <key-property name="ename" column="ename" > </key-property>
                <key-property name="job" column="job" ></key-property>
                <key-property name="hiredate" column="hiredate" ></key-property>
                <key-property name="sal" column="sal" ></key-property>
                <key-property name="comm" column="comm" ></key-property>
                <key-property name="clob" column="clob" ></key-property>
            </composite-id>
        </class>
    </hibernate-mapping>

     

    2、hibernate.cfg.xml

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
      <session-factory>
        <property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=model</property>
        <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="connection.username">sa</property>
        <property name="connection.password">starlin.cn</property>
        <mapping class="springtest.hibernate.EmpEntity"/>
        <mapping resource="springtest/EmpEntity.hbm.xml"/>
        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
      </session-factory>
    </hibernate-configuration>

    3、EmpEntity.java  注意:一定要序列化,不然会报错的

    package springtest.hibernate;
    
    import javax.persistence.*;
    import java.io.Serializable;
    
    /**
     * Created by starlin
     * on 2015/12/12 20:57.
     */
    @Entity
    @Table(name = "emp", schema = "dbo", catalog = "model")
    public class EmpEntity implements Serializable{
        private String empno;
        private String ename;
        private String job;
        private String hiredate;
        private String sal;
        private String comm;
        private String clob;
        @Basic
        @Column(name = "empno")
        public String getEmpno() {
            return empno;
        }
    
        public void setEmpno(String empno) {
            this.empno = empno;
        }
    
        @Basic
        @Column(name = "ename")
        public String getEname() {
            return ename;
        }
    
        public void setEname(String ename) {
            this.ename = ename;
        }
    
        @Basic
        @Column(name = "job")
        public String getJob() {
            return job;
        }
    
        public void setJob(String job) {
            this.job = job;
        }
    
        @Basic
        @Column(name = "hiredate")
        public String getHiredate() {
            return hiredate;
        }
    
        public void setHiredate(String hiredate) {
            this.hiredate = hiredate;
        }
    
        @Basic
        @Column(name = "sal")
        public String getSal() {
            return sal;
        }
    
        public void setSal(String sal) {
            this.sal = sal;
        }
    
        @Basic
        @Column(name = "comm")
        public String getComm() {
            return comm;
        }
    
        public void setComm(String comm) {
            this.comm = comm;
        }
    
        @Basic
        @Column(name = "clob")
        public String getClob() {
            return clob;
        }
    
        public void setClob(String clob) {
            this.clob = clob;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            EmpEntity empEntity = (EmpEntity) o;
    
            if (empno != null ? !empno.equals(empEntity.empno) : empEntity.empno != null) return false;
            if (ename != null ? !ename.equals(empEntity.ename) : empEntity.ename != null) return false;
            if (job != null ? !job.equals(empEntity.job) : empEntity.job != null) return false;
            if (hiredate != null ? !hiredate.equals(empEntity.hiredate) : empEntity.hiredate != null) return false;
            if (sal != null ? !sal.equals(empEntity.sal) : empEntity.sal != null) return false;
            if (comm != null ? !comm.equals(empEntity.comm) : empEntity.comm != null) return false;
            if (clob != null ? !clob.equals(empEntity.clob) : empEntity.clob != null) return false;
    
    
            return true;
        }
    
        @Override
        public int hashCode() {
            int result = empno != null ? empno.hashCode() : 0;
            result = 31 * result + (ename != null ? ename.hashCode() : 0);
            result = 31 * result + (job != null ? job.hashCode() : 0);
            result = 31 * result + (hiredate != null ? hiredate.hashCode() : 0);
            result = 31 * result + (sal != null ? sal.hashCode() : 0);
            result = 31 * result + (comm != null ? comm.hashCode() : 0);
            result = 31 * result + (clob != null ? clob.hashCode() : 0);
            return result;
        }
    
    
    }

    4、最后一个测试类Test.java

    package springtest.hibernate;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    
    /**
     * Created by starlin
     * on 2015/12/11 22:58.
     */
    public class Test {
        public static void main(String[] args) {
            EmpEntity empEntity = new EmpEntity();
            empEntity.setEmpno("9000");
            empEntity.setEname("hibernate");
            empEntity.setJob("test");
            empEntity.setHiredate("2015-12-12");
            empEntity.setSal("3000");
            empEntity.setComm("sfsf");
            empEntity.setClob("clob");
            //实例化Configuration,这行代码默认加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();
            //以Configuration创建SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            //实例化session
            Session session = sessionFactory.openSession();
            //开始事物
            Transaction transaction = session.beginTransaction();
            //保存消息
            session.save(empEntity);
            //提交事物
            transaction.commit();
            //关闭session
            session.close();
        }
    }
     

    5、测试log

    QQ截图20151212221117

     

    6、数据库成功插入

    image

     

    以上,感谢观看,有问题请留言

    转载于:https://www.cnblogs.com/starlin/p/5041956.html

    展开全文
  • MySQL----标识列

    2020-09-04 10:53:22
    2.一个表中多少个标识列?1个 3.标识列类型只能是数值型。 4.标识列,可以通过SET auto_increment_increment=3;设置步长 也可以通过手动插入值,设置起始值。 */ #一、创建表时设置标识列 DROP TABLE IF EXISTS ...
    #标识列
    /*
    又称为自增长列
    含义:可以不用手动的插入值,系统提供默认的序列值
    特点:
    1.标识列必须和主键搭配吗?不一定,但要求是一个key(主键、外键、唯一)
    2.一个表中有多少个标识列?1个
    3.标识列类型只能是数值型。
    4.标识列,可以通过SET auto_increment_increment=3;设置步长
    也可以通过手动插入值,设置起始值。
    
    */
    #一、创建表时设置标识列
    DROP TABLE IF EXISTS tab_identify;
    CREATE TABLE tab_identify(
             id INT ,
             NAME VARCHAR(20)
    );
    TRUNCATE TABLE tab_identify;
    INSERT INTO tab_identify VALUES(10,'Lay');
    INSERT INTO tab_identify VALUES(NULL,'Lay');
    INSERT INTO tab_identify(NAME) VALUES('Zhang');
    SELECT * FROM tab_identify;
    SHOW VARIABLES LIKE '%auto_increment%';
    SET auto_increment_increment=3;
    
    #二、修改表时设置标识列
    ALTER TABLE tab_identify MODIFY COLUMN id INT PRIMARY 
    KEY AUTO_INCREMENT;
    
    #三、修改表示删除标识列
    
    ALTER TABLE tab_identify MODIFY COLUMN id INT ;
    
    
    
    展开全文
  • 2、一个表中可以多少个标识列? 至多一个 3、标识列的类型有没有限制? 只能是数值型,一般是int ,(float,double也可以) 4、标识列设置步长的方式:SET auto_increment_increment = 3; 也可以通过手动插入...

    标识列

    又称“自增长列"

     

    特点:
    1、自增长列必须和主键搭配吗?
        不一定,但必须是一个key,(如:unique,primary key,foreign key)
    2、一个表中可以有多少个标识列?
        至多一个
    3、标识列的类型有没有限制?
        只能是数值型,一般是int ,(float,double也可以)
    4、标识列设置步长的方式:SET auto_increment_increment = 3;
       也可以通过手动插入起始值,更改起始索引。
    

    一、创建表时加自增长列

    创建表

     

    CREATE TABLE tab_identity(
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20)
    );
    INSERT INTO tab_identity VALUES (NULL,'Pinkfox');
    INSERT INTO tab_identity (NAME) VALUES ('Pink');
    SELECT * FROM tab_identity;
    

    更改步长

     

    SHOW VARIABLES LIKE '%auto_increment%';
    #auto_increment_increment 步长
    #auto_increment_offset 起始值,但在mysql中不起作用
    SET auto_increment_increment = 3;
    
    INSERT INTO tab_identity VALUES (NULL,'Pinkfox');
    INSERT INTO tab_identity (NAME) VALUES ('Pink');
    INSERT INTO tab_identity (NAME) VALUES ('fox');
    SELECT * FROM tab_identity;
    

    步长=3.png

     

    要想更改起始值,可以手动插入第一个值,然后再auto_increment

     

    TRUNCATE TABLE tab_identity;
    INSERT INTO tab_identity VALUES (5,'Pinkfox');
    INSERT INTO tab_identity (NAME) VALUES ('Pink');
    INSERT INTO tab_identity (NAME) VALUES ('fox');
    SELECT * FROM tab_identity;
    

    设置起始值为5.png

    二、修改表时添加标识列

     

    DROP TABLE IF EXISTS tab_identity;
    CREATE TABLE tab_identity(
        id INT ,
        NAME VARCHAR(20)
    );
    

    修改表

     

    ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
    DESC tab_identity;
    

    修改表时添加标识列.png

    三、修改表时删除标识列

     

    ALTER TABLE tab_identity MODIFY COLUMN id INT ;
    DESC tab_identity;
    

    修改表时删除标识列.png

    TCL

    Transaction Control Language 事物控制语言

     

    事务: 
      一个或者一组sql语句组成的执行单元,这个单元要么全部执行,要么全部不执行
    

    案例:转账
    我有1000块,你有1000块,你转给我500.
    此时要么全部执行,我1500,你5000;要么执行失败,我1000,你1000.

    update table 表 set 总额=1500 where name = '我'
    意外
    update table 表 set 总额=500 where name= '你'

    我们希望这个事务要么全部执行,要不全部不执行,不希望,有我给你转了钱,你没收到的情况发生。

     

    事务的特性ACID
      1、原子性atomicity:不可再分
      2、一致性consistency:执行前后状态一致,总额还是2000
      3、隔离性isolation:互不影响
      4、永久性durability:一旦提交事务,改变将是不可逆的,永久的
    
    事务的创建:
    1、显式事务
        insert update delete 
    2、隐式事务:事务具有明显的开启和结束标记
        前提:必须先设置自动提交功能为禁用
        set autocommit = 0;
    
    步骤1:开启事务
    set autocommit = 0;
    start transaction; #可选的
    步骤2:编写事务中的sql语句(select insert update delete)
    语句1;
    语句2;
    ……
        savepoint 回滚点名;   #设置保存点
    
    步骤3:结束事务
    commit;#提交事务
    rollback;#回滚事务(就是撤销操作,回到之前的状态)
    rollback to 回滚点名;
    

     

    SHOW VARIABLES LIKE '%autocommit%';
    SHOW ENGINES;#有的是不支持事务的,默认InnoDB ,它是支持事务的。
    

    1、演示事务的使用步骤

     

    DROP TABLE IF EXISTS book;
    CREATE TABLE book(
        id INT PRIMARY KEY AUTO_INCREMENT,
        bname VARCHAR(20),
        price INT,
        authorid INT
        
    );
    INSERT INTO book VALUES(NULL,'story',25,1);
    INSERT INTO book VALUES(NULL,'aaa',15,2);
    SELECT * FROM book;
     
    SHOW VARIABLES LIKE 'character%';
    
    #开启事务
    SET autocommit = 0;
    START TRANSACTION;
    #编写一组事务语句
    UPDATE book SET price = 30 WHERE bName = 'story';
    UPDATE book SET price = 40 WHERE bName = 'aaa';
    #结束事务
    COMMIT;
    

    事务的并发问题:

    同时运行多个事务,且这些事务访问相同数据时,如果没有隔离机制,就会导致并发问题。
    1、脏读:T1读取了已经被T2更新但没有被提交的字段,若T2回滚,则T1读到的是临时无效的数据。
    例如:微信发消息,我给撤回了,撤回之前你看到的都是无效的
    2、不可重复读(只能读一遍,在读就不一样了):T2回滚,导致两次看到的T1字段不一样。
    3、幻读:T2的插入(删除)还没提交时,导致两次的T1不一样。
    与脏读的区别在于:脏读发生在更新时,幻读发生在插入和删除时。

    ( 事务的并发事件,通过控制端口进行演示,这就不写了。)

    总结一下命令:

    1.查看当前隔离级别: select @@tx_isolation;
    mysql默认的并不是最高的隔离级别,仍可能发生幻读现象。但是避免了脏读和不可重复读

    2.设置当前的隔离级别:
    set session transaction isolation level 隔离级别;

    3.设置数据库系统的全局隔离级别:
    set global transaction isolation level 隔离级别;
    因为每启动一个mysql程序,就会获得单独的一个数据库连接。每个数据库连接都有一个全局变量@@tx_isolation,表示当前事务的隔离级别。

    4.事务的隔离级别:

     

                                     脏读      不可重复读      幻读
     read uncommitted:                 ×           ×            ×
     read committed(oracle默认):      √           ×            ×
     repeatable read(mysql默认):      √           √            ×
     serializable 串行化:                     √           √            √
    

    √:表示已解决的问题。

     

    事务的隔离级别.png

    2 delete和truncate在事务中的区别

    事务中包含的是delete语句,最后回滚,原来的数据还存在;
    事务中包含的是truncate语句,最后回滚,原来的数据就不存在了。



     

    展开全文
  • MySQL入门 DDL语言之十六:标识列 ...2、一个表中可以多少个标识列?  只能有一个 3、标识列类型只能是数值型(一般使用int) 4、标识列可以通过 SET auto_increment_increment = 3;设置步长 可以通...
  • 这样我有多少个category.name就返回多少个list,然后遍历每个list就行了。但是这样会造成多条sql语句查询,事务是用spring 配置的在service层的自动事务管理, (2).只用一条HQL 查出一个list结果类似下面 id ...
  • mysql索引的面试题

    万次阅读 2019-08-15 18:24:18
    主要是在所有的叶子结点增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分使用默认自增的主键作为主索引。 3.什么情况下设置了索引但无法使用 1.以“%”开头的LIKE语句,模糊匹配 2. OR语句前后没有...
  • 给定一个单词a,如果通过交换单词字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有多少个兄弟单词? 3.4.8 找出数组出现次数超过一半...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    select:从一个或多个表中检索一个或多个数据列。包含信息:想选择什么表,从什么地方选择。必须要有From子句。(最常用) 当从多张表里查询的时候,会产生笛卡尔积;可用条件过滤它。 当两个表有相同字段时必须加...
  • 日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...
  • 3、QueryBuilder:单查询基本上都可以实现零Sql(除非查询条件特别复杂的),更新、删除等操作也可以通过QueryBuilder进行批量处理,不局限于根据主键来处理。 4、分表操作的支持:对于分表操作和常规的使用...
  • 每个产品的主键是ProductID,Numeric型并且每个产品有一个字母描述字段,名为ProductName。您使用一个SqlDataAdapter对象和一个SqlCommand对象通过调用一个存储过程从数据库获取产品数据。您将SqlCommand对象的...
  • 经典SQL语句大全

    热门讨论 2014-12-20 12:00:30
    3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 add...
  • 3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 ...
  • 1、java有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 56 2、sleep() 和 wait() 有什么区别? 56 3、当一个线程进入一个对象的一个synchronized方法后,其它线程...
  • CruiseYoung提供的带有... 17.4 根据一个表创建另一个表 290 17.5 创建索引编排表 292 17.6 创建视图 293 17.6.1 视图的稳定性 293 17.6.2 视图的order by 294 17.6.3 创建只读视图 295 17.7 索引 295 17.7.1 ...
  • 5.5.1 提交一个事务 154 5.5.2 回滚一个事务 155 5.6 数据一致性和数据并发性 155 5.6.1 数据库写入器和写前协议 155 5.6.2 SCN 156 5.6.3 撤销管理 156 5.7 备份与恢复体系结构 157 5.7.1 用户管理...
  • 9.5.2 3或更多数据的关联 179 9.6 合并查询结果(UNION) 181 9.7 分组查询,统计函数(GROUP BY) 181 9.7.1 统计函数 182 9.7.2 统计函数GROUP_CONCAT() 183 9.7.3 对多数据列进行GROUP BY查询 184 ...
  • 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走多远 99 4.3 规范化过程 100 4.4 实体和属性的形式:第范式 100 4.4.1 所有属性必须是原子的 101 4.4.2 实体的所有实例必须包含相同数量的值 104 4.4.3 ...
  • SQL sever 实训

    2018-06-28 21:10:03
    --计算有多少种产品(假设为x),然后显示条信息:共有X种产品 DECLARE @X int SET @X =(SELECT COUNT (*) FROM Product ) PRINT '共有'+convert (char(2),@x)+'种产品。' GO --编写计算n!(n=20)的程序,并...
  • Oracle事例

    2007-08-26 10:35:53
    14、查询从多少行到多少行的记录(可以用在web开发的分页显示) select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b ) where row_id between 15 and 20 15、对公共授予访问权 ...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

一个表中可以设置多少个主键