精华内容
下载资源
问答
  • 如何设置编号为主键
    千次阅读
    2021-01-18 18:38:30

    1、自动编号(AUTO_INCREMENT),必须与主键组合使用

    默认情况下,起始值为1,增量也为1。

    2、主键(PRIMARY KEY)

    每张数据表只能存在一个主键

    主键保证记录的唯一性

    主键自动为NOT NULL

    3、AUTO_INCREMENT必须与主键一起使用,主键不一定必须与AUTO_INCREMENT一起使用。

    mysql> CREATE TABLE tb3(

    -> id SMALLINT UNSIGNEDAUTO_INCREMENT PRIMARY KEY,

    -> username VARCHAR(30) NOT NULL

    -> );

    Query OK, 0 rows affected (0.35 sec)

    mysql>

    mysql> SHOW COLUMNS FROM tb3; #查看数据表结构

    +----------+----------------------+------+-----+---------+----------------+

    | Field        | Type                       | Null | Key | Default   |       Extra          |

    +----------+----------------------+------+-----+---------+----------------+

    | id            | smallint(5) unsigned | NO  | PRI  | NULL      | auto_increment |

    | username | varchar(30)             | NO  |        | NULL     |

    +----------+----------------------+------+-----+---------+----------------+

    2 rows in set (0.14 sec)

    mysql> INSERT tb3(useRname) VALUES('JOHN');

    Query OK, 1 row affected (0.04 sec)

    mysql> INSERT tb3(useRname) VALUES('Tom');

    Query OK, 1 row affected (0.04 sec)

    mysql> INSERT tb3(useRname) VALUES('Rose');

    Query OK, 1 row affected (0.02 sec)

    mysql> INSERT tb3(useRname) VALUES('Dimi tar');

    Query OK, 1 row affected (0.04 sec)

    mysql> SELECT * FROM tb3;

    +----+----------+

    | id | username |

    +----+----------+

    | 1  | JOHN       |

    | 2  | Tom        |

    | 3  | Rose        |

    | 4  | Dimi tar    |

    +----+----------+

    4、创建一张表只有主键,没有AUTO_INCREMENT

    mysql> CREATE TABLE tb4(

    -> id SMALLINT UNSIGNED PRIMARY KEY,

    -> usename VARCHAR(20) NOT NULL

    -> );

    Query OK, 0 rows affected (0.22 sec)

    mysql>

    mysql> SHOW COLUMNS FROM tb4;

    +---------+----------------------+------+-----+---------+-------+

    | Field       | Type                        | Null    | Key | Default   | Extra |

    +---------+----------------------+------+-----+---------+-------+

    |id         | smallint(5) unsigned  | NO     | PRI | NULL      |          |

    | usename | varchar(20)              | NO     |       | NULL      |          |

    +---------+----------------------+------+-----+---------+-------+

    2 rows in set (0.07 sec)

    主键允许赋值,但不允许存在两个相同的值

    mysql> INSERT tb4 VALUES(4, 'Tom');

    Query OK, 1 row affected (0.03 sec)

    mysql> INSERT tb4 VALUES(22, 'Tom');

    Query OK, 1 row affected (0.05 sec)

    mysql> SELECT * FROM tb4;

    +----+---------+

    | id    | usename|

    +----+---------+

    | 4    | Tom       |

    |22  | Tom       |

    +----+---------+

    2 rows in set (0.00 sec)

    mysql> INSERT tb4 VALUES(22, 'Li');

    ERROR 1062 (23000): Duplicate entry '22' for key 'PRIMARY'

    更多相关内容
  • 新建一数据表,里面有字段id,将id设为主键且自动编号 代码如下: create table tb(id int identity(1,1),constraint pkid primary key (id)) create table tb(id int identity(1,1) primary key ) 3.已经建好一数据...
  • 1、自动编号(AUTO_INCREMENT),必须与主键组合使用默认情况下,起始值1,增量也1。2、主键(PRIMARY KEY)每张数据表只能存在一个主键主键保证记录的唯一性主键自动NOT NULL3、AUTO_INCREMENT必须与主键一起使用...

    1、自动编号(AUTO_INCREMENT),必须与主键组合使用

    默认情况下,起始值为1,增量也为1。

    2、主键(PRIMARY KEY)

    每张数据表只能存在一个主键

    主键保证记录的唯一性

    主键自动为NOT NULL

    3、AUTO_INCREMENT必须与主键一起使用,主键不一定必须与AUTO_INCREMENT一起使用。

    mysql> CREATE TABLE tb3(-> id SMALLINT UNSIGNEDAUTO_INCREMENT PRIMARY KEY,-> username VARCHAR(30) NOT NULL-> );Query OK, 0 rows affected (0.35 sec)

    mysql> mysql> SHOW COLUMNS FROM tb3; #查看数据表结构+----------+----------------------+------+-----+---------+----------------+| Field        | Type                       | Null | Key | Default   |       Extra          |+----------+----------------------+------+-----+---------+----------------+| id            | smallint(5) unsigned | NO  | PRI  | NULL      | auto_increment || username | varchar(30)             | NO  |        | NULL     | +----------+----------------------+------+-----+---------+----------------+2 rows in set (0.14 sec)

    mysql> INSERT tb3(useRname) VALUES('JOHN');Query OK, 1 row affected (0.04 sec)

    mysql> INSERT tb3(useRname) VALUES('Tom');Query OK, 1 row affected (0.04 sec)

    mysql> INSERT tb3(useRname) VALUES('Rose');Query OK, 1 row affected (0.02 sec)

    mysql> INSERT tb3(useRname) VALUES('Dimi tar');Query OK, 1 row affected (0.04 sec)

    mysql> SELECT * FROM tb3;+----+----------+| id | username |+----+----------+| 1  | JOHN       || 2  | Tom        || 3  | Rose        || 4  | Dimi tar    |+----+----------+

    4、创建一张表只有主键,没有AUTO_INCREMENT

    mysql> CREATE TABLE tb4(-> id SMALLINT UNSIGNED PRIMARY KEY,-> usename VARCHAR(20) NOT NULL-> );Query OK, 0 rows affected (0.22 sec)

    mysql>mysql> SHOW COLUMNS FROM tb4;+---------+----------------------+------+-----+---------+-------+| Field       | Type                        | Null    | Key | Default   | Extra |+---------+----------------------+------+-----+---------+-------+|id         | smallint(5) unsigned  | NO     | PRI | NULL      |          || usename | varchar(20)              | NO     |       | NULL      |          |+---------+----------------------+------+-----+---------+-------+2 rows in set (0.07 sec)

    主键允许赋值,但不允许存在两个相同的值

    mysql> INSERT tb4 VALUES(4, 'Tom');Query OK, 1 row affected (0.03 sec)

    mysql> INSERT tb4 VALUES(22, 'Tom');Query OK, 1 row affected (0.05 sec)

    mysql> SELECT * FROM tb4;+----+---------+| id    | usename|+----+---------+| 4    | Tom       ||22  | Tom       |+----+---------+2 rows in set (0.00 sec)

    mysql> INSERT tb4 VALUES(22, 'Li');ERROR 1062 (23000): Duplicate entry '22' for key 'PRIMARY'

    ======================================

    如果有phpmyadmin的话,

    可以直接在建表的时候,有个“额外”这个选项,点击进入,选中AUTO_INCREMENT

    ===================================

    在MySql中创建表:mysql> create table test(-> id int not null primary key auto_increment, //ID 为自动编号-> name varchar(20)-> );Query OK, 0 rows affected (0.49 sec)插入数据:mysql> insert into test(name)-> values('hello');Query OK, 1 row affected (0.14 sec)mysql> select * from test;+----+-------+| id | name  |+----+-------+|  1 | hello |+----+-------+1 row in set (0.01 sec)

    展开全文
  • access设置主键

    千次阅读 2021-01-17 18:34:02
    在access中设置主键,指的是把某个数据表的某个字段设置为关键字段!下面我们先大体来了解主键是何概念!所谓的主键,其实并非大家想象中的那么神秘,主键其实也是一个字段而已,只不过,该字段中的任何数据,都是...

    在access中设置主键,指的是把某个数据表的某个字段设置为关键字段!

    下面我们先大体来了解主键是何概念!所谓的主键,其实并非大家想象中的那么神秘,主键其实也是一个字段而已,只不过,该字段中的任何数据,都是唯一的,没有任何两个数据相同,这就好比我们的身份证号码一样,没有任何两个人的身份证号码相同。具有唯一性的字段可设置为主键,换句话说,如果想让某个字段的数据不重复,那么,就可以将其设置为主键。

    主键的一个用途在于,没有重复的数据;另外,主键也是不同数据表之间产生关联的参照物;还有,主键更是检索数据的参照对象,主键在数据检索方面特别有效益。

    最后,我们再来了解一个常识:并非所有的字段都适合做主键,比如姓名、性别等这些字段,数据可能会存在重复,因此不适合做主键。像编号、序号等这样的字段,里面的数据不重复的,就适合做主键了。

    总之,主键指的是数据具有唯一性的可为数据检索提供效益的同时还能与其它数据表建立关联的一种特殊字段。下面,我们来学习如何建立主键吧。

    如下图一样,在数据表对象中,选择“食品销售统计”数据表。

    1eacea465989f877bb8d0b3a3ee4f7be.gif

    然后,如下图一样,点击右键然后选择“设计视图”。

    e729878ba6a5695d6eec7cdde59a89da.gif

    打开如下的对话框。

    67b5a21f86c1313c19e32660882b6806.gif

    上图中,选择要设置为主键的字段,如本例的食品编号,然后点击右键,在菜单中选择“主键”。这样,字段就被设置为主键了,被设置为主键的字段,前面会有一把钥匙的图标,看下图就明白了。

    2977fc2db5a4851355183741f17eb002.gif

    另外,一旦字段被设置为主键,那么,该字段的其中的一个重要的属性就是,数据不能垂直重复,因此,就会像上图一样,蓝线圈住那部分,在索引那里的属性为“有”,这有利于数据的查询检索,同时,还有“无重复”。

    2d0677c43cdf2ec9eb450a858782b2a4.gif

    设置好主键之后,如果想取消字段的这种属性,那么,方法也简单了,同样,如上图一样,右键主键字段,在弹出的菜单中再次选择“主键”,这样,就取消主键的设置了。

    展开全文
  • 主要介绍了SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下
  • MySQL必知必会05:正确设置主键

    千次阅读 2022-02-27 13:09:16
    会员信息表(demo.membermaster)的设计大体如下,为了能够唯一地标识一个会员的信息,需要会员信息表设置一个主键。怎么这个表设置主键,才能达到理想的目标? cardno (卡号) membername (名称) ...

    阅读整理自《MySQL 必知必会》- 朱晓峰,详细内容请登录 极客时间 官网购买专栏。


    在一个项目中,客户要进行会员营销,相应的,就需要处理会员信息。会员信息表(demo.membermaster)的设计大体如下,为了能够唯一地标识一个会员的信息,需要为会员信息表设置一个主键。怎么为这个表设置主键,才能达到理想的目标?

    cardno
    (卡号)
    membername
    (名称)
    memberphone
    (电话)
    memberpid
    (身份证号)
    address
    (地址)
    sex
    (性别)
    birthday
    (生日)
    10000001张三18758079160110123200001017890北京2000-01-01 00:00:00
    10000002李四18758079161123123199001012356上海1990-01-01 00:00:00

    三种设置主键的思路:业务字段做主键自增字段做主键手动赋值字段做主键

    业务字段做主键

    会员卡号(cardno)看起来比较合适,因为会员卡号不能为空,而且有唯一性,可以用来标识一条会员记录。

    mysql> create table demo.membermaster
        -> (
        -> cardno char(8) primary key,
        -> membername text,
        -> memberphone text,
        -> memberpid text,
        -> memberaddress text,
        -> sex text,
        -> birthday datetime
        -> );
    Query OK, 0 rows affected (0.10 sec)
    
    mysql> describe demo.membermaster;
    +---------------+----------+------+-----+---------+-------+
    | Field         | Type     | Null | Key | Default | Extra |
    +---------------+----------+------+-----+---------+-------+
    | cardno        | char(8)  | NO   | PRI | NULL    |       |
    | membername    | text     | YES  |     | NULL    |       |
    | memberphone   | text     | YES  |     | NULL    |       |
    | memberpid     | text     | YES  |     | NULL    |       |
    | memberaddress | text     | YES  |     | NULL    |       |
    | sex           | text     | YES  |     | NULL    |       |
    | birthday      | datetime | YES  |     | NULL    |       |
    +---------------+----------+------+-----+---------+-------+
    7 rows in set (0.02 sec)
    

    会员卡号做主键有没有什么问题?插入 2 条数据来验证下:

    mysql> insert into demo.membermaster
        -> (cardno, membername, memberphone, memberpid, memberaddress, sex, birthday)
        -> values
        -> ('10000001', '张三', '18758079160', '110123200001017890', '北京', '男', '2000-01-01');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into demo.membermaster
        -> (cardno, membername, memberphone, memberpid, memberaddress, sex, birthday)
        -> values ('10000002','李四','18758079161', '123123199001012356', '上海', '女', '1990-01-01');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from demo.membermaster;
    +----------+------------+-------------+--------------------+---------------+------+---------------------+
    | cardno   | membername | memberphone | memberpid          | memberaddress | sex  | birthday            |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+
    | 10000001 | 张三       | 18758079160 | 110123200001017890 | 北京          || 2000-01-01 00:00:00 |
    | 10000002 | 李四       | 18758079161 | 123123199001012356 | 上海          || 1990-01-01 00:00:00 |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+
    2 rows in set (0.00 sec)
    

    不同的会员卡号对应不同的会员,字段“cardno”唯一地标识某一个会员。

    实际情况是,存在“cardno”无法唯一识别某一个会员的问题。因为会员卡号存在重复使用的情况。比如,张三不再到商家的门店消费了(退还了会员卡),于是张三就不再是这个商家门店的会员了。商家不想让这个会员卡空着,就把卡号是“10000001”的会员卡发给了王五。

    从系统设计的角度看,这个变化只是修改了会员信息表中的卡号是“10000001”这个会员信息,并不会影响到数据一致性。也就是说,修改会员卡号是“10000001”的会员信息,系统的各个模块,都会获取到修改后的会员信息,不会出现“有的模块获取到修改之前的会员信息,有的模块获取到修改后的会员信息,而导致系统内部数据不一致”的情况。因此,从信息系统层面上看是没问题的。但是从使用系统的业务层面来看,就有很大的问题了,会对商家造成影响。

    比如有一个销售流水表,记录了所有的销售流水明细。2020 年 12 月 01 日,张三在门店购买了一本书,消费了 89 元。那么,系统中就有了张三买书的流水记录,如下所示:

    transactionno
    (流水单号)
    itemnumber
    (商品编号)
    quantity
    (销售数量)
    price
    (价格)
    salesvalue
    (销售金额)
    cardno
    (会员卡号)
    transdate
    2020-12-01
    1118989100000012020-12-01

    创建销售流水表:

    mysql> create table demo.trans
        -> (
        -> transactionno int, itemnumber int, quantity decimal(10,3), price decimal(10,2), salesvalue decimal(10,2), cardno char(8), transdate datetime
        -> );
    Query OK, 0 rows affected (0.05 sec)
    

    插入一条销售流水:

    mysql> insert into demo.trans
        -> (transactionno, itemnumber, quantity, price, salesvalue, cardno, transdate)
        -> values
        -> (1, 1, 1, 89, 89, '10000001', '2020-12-01');
    Query OK, 1 row affected (0.01 sec)
    

    查询一下 2020 年 12 月 01 日的会员销售记录:

    mysql> select b.membername, c.goodname, a.quantity, a.salesvalue, a.transdate
        -> from demo.trans as a
        -> join demo.membermaster as b
        -> join demo.goodsmaster as c
        -> on (a.cardno = b.cardno and a.itemnumber = c.itemnumber);
    +------------+----------+----------+------------+---------------------+
    | membername | goodname | quantity | salesvalue | transdate           |
    +------------+----------+----------+------------+---------------------+
    | 张三       | book     |    1.000 |      89.00 | 2020-12-01 00:00:00 |
    +------------+----------+----------+------------+---------------------+
    

    假设会员卡 10000001 又发给了王五,需要更改会员信息表:

    mysql> update demo.membermaster
        -> set membername = '王五',
        -> memberphone = '13698765432',
        -> memberpid = '475145197001012356',
        -> memberaddress = '天津',
        -> sex = '女',
        -> birthday = '1970-01-01'
        -> where cardno = '10000001';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from demo.membermaster;
    +----------+------------+-------------+--------------------+---------------+------+---------------------+
    | cardno   | membername | memberphone | memberpid          | memberaddress | sex  | birthday            |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+
    | 10000001 | 王五       | 13698765432 | 475145197001012356 | 天津          || 1970-01-01 00:00:00 |
    | 10000002 | 李四       | 18758079161 | 123123199001012356 | 上海          || 1990-01-01 00:00:00 |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+
    2 rows in set (0.00 sec)
    

    再次运行之前的会员消费流水查询:

    mysql> select b.membername, c.goodname, a.quantity, a.salesvalue, a.transdate
        -> from demo.trans as a
        -> join demo.membermaster as b
        -> join demo.goodsmaster as c
        -> on (a.cardno = b.cardno and a.itemnumber = c.itemnumber);
    +------------+----------+----------+------------+---------------------+
    | membername | goodname | quantity | salesvalue | transdate           |
    +------------+----------+----------+------------+---------------------+
    | 王五       | book     |    1.000 |      89.00 | 2020-12-01 00:00:00 |
    +------------+----------+----------+------------+---------------------+
    1 row in set (0.00 sec)
    

    很明显,这个结果把张三的消费行为放到王五身上去了,肯定是不对的。这里的原因就是,我们把会员卡号是“10000001”的会员信息改了,而会员卡号是主键,会员消费查询通过会员卡号关联到会员信息,得到了完全错误的结果。

    所以,千万不能把会员卡号当做主键。实际情况下,不管是会员电话号码、身份证号都不适合作为主键。

    **尽量不要用业务字段,也就是跟业务有关的字段做主键。**毕竟,作为项目设计的技术人员,谁也无法预测在项目的整个生命周期中,哪个业务字段会因为项目的业务需求而有重复,或者重用之类的情况出现。


    使用自增字段做主键

    给会员信息表添加一个字段,比如叫 id,给这个字段定义自增约束,这样就有了一个具备唯一性的,而且不为空的字段来做主键了。

    修改一下会员信息表的结构,添加一个自增字段做主键。

    第一步,修改会员信息表,删除表的主键约束,这样,原来的主键字段,就不再是主键了。
    不过需要注意的是,删除主键约束,并不会删除字段:

    mysql> alter table demo.membermaster
        -> drop primary key;
    Query OK, 2 rows affected (0.15 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    

    第二步,修改会员信息表,添加字段“id”为主键,并且给它定义自增约束:

    mysql> alter table demo.membermaster
        -> add id int primary key auto_increment;
    Query OK, 0 rows affected (0.09 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    第三步,修改销售流水表,添加新的字段 memberid,对应会员信息表中的主键:

    mysql> alter table demo.trans
        -> add memberid int;
    Query OK, 0 rows affected (0.03 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    第四步,更新一下销售流水表,给新添加的字段 memberid 赋值,让它指向对应的会员信息:

    mysql> update demo.trans as a, demo.membermaster as b
        -> set a.memberid = b.id
        -> where a.transactionno > 0;
        -- > AND a.cardno = b.cardno; -- 这样操作可以不用删除trans的内容,在实际工作中更适合
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    

    demo.membermaster 和 demo.trans 的结构:

    mysql> describe demo.membermaster;
    +---------------+----------+------+-----+---------+----------------+
    | Field         | Type     | Null | Key | Default | Extra          |
    +---------------+----------+------+-----+---------+----------------+
    | cardno        | char(8)  | NO   |     | NULL    |                |
    | membername    | text     | YES  |     | NULL    |                |
    | memberphone   | text     | YES  |     | NULL    |                |
    | memberpid     | text     | YES  |     | NULL    |                |
    | memberaddress | text     | YES  |     | NULL    |                |
    | sex           | text     | YES  |     | NULL    |                |
    | birthday      | datetime | YES  |     | NULL    |                |
    | id            | int      | NO   | PRI | NULL    | auto_increment |
    +---------------+----------+------+-----+---------+----------------+
    8 rows in set (0.01 sec)
    
    mysql> describe demo.trans;
    +---------------+---------------+------+-----+---------+-------+
    | Field         | Type          | Null | Key | Default | Extra |
    +---------------+---------------+------+-----+---------+-------+
    | transactionno | int           | YES  |     | NULL    |       |
    | itemnumber    | int           | YES  |     | NULL    |       |
    | quantity      | decimal(10,3) | YES  |     | NULL    |       |
    | price         | decimal(10,2) | YES  |     | NULL    |       |
    | salesvalue    | decimal(10,2) | YES  |     | NULL    |       |
    | cardno        | char(8)       | YES  |     | NULL    |       |
    | transdate     | datetime      | YES  |     | NULL    |       |
    | memberid      | int           | YES  |     | NULL    |       |
    +---------------+---------------+------+-----+---------+-------+
    8 rows in set (0.00 sec)
    

    验证前,先将表中的 cardno 为 10000001 的用户改回张三:

    mysql> select * from demo.membermaster;
    +----------+------------+-------------+--------------------+---------------+------+---------------------+----+
    | cardno   | membername | memberphone | memberpid          | memberaddress | sex  | birthday            | id |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+----+
    | 10000001 | 张三       | 18758079160 | 110123200001017890 | 北京          || 2000-01-01 00:00:00 |  1 |
    | 10000002 | 李四       | 18758079161 | 123123199001012356 | 上海          || 1990-01-01 00:00:00 |  2 |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+----+
    

    如果张三的会员卡 10000001 不再使用,发给了王五,就在会员信息表里面增加一条记录:

    mysql> insert into demo.membermaster
        -> (cardno, membername, memberphone, memberpid, memberaddress, sex, birthday)
        -> values
        -> ('10000001', '王五', '13698765432', '475145197001012356', '南京', '男', '1992-02-02');
    Query OK, 1 row affected (0.00 sec)
    

    查看所有会员信息:

    mysql> select * from demo.membermaster;
    +----------+------------+-------------+--------------------+---------------+------+---------------------+----+
    | cardno   | membername | memberphone | memberpid          | memberaddress | sex  | birthday            | id |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+----+
    | 10000001 | 张三       | 18758079160 | 110123200001017890 | 北京          || 2000-01-01 00:00:00 |  1 |
    | 10000002 | 李四       | 18758079161 | 123123199001012356 | 上海          || 1990-01-01 00:00:00 |  2 |
    | 10000001 | 王五       | 13698765432 | 475145197001012356 | 南京          || 1992-02-02 00:00:00 |  3 |
    +----------+------------+-------------+--------------------+---------------+------+---------------------+----+
    3 rows in set (0.00 sec)
    

    由于字段 cardno 不再是主键,可以允许重复,因此,我们可以在保留会员“李四”信息的同时,添加使用同一会员卡号的“赵六”的信息。

    现在再来查会员消费,就不会出问题了:

    mysql> select b.membername, c.goodname, a.quantity, a.salesvalue, a.transdate
        -> from demo.trans as a
        -> join demo.membermaster as b
        -> join demo.goodsmaster as c
        -> on (a.memberid = b.id and a.itemnumber = c.itemnumber);
    +------------+----------+----------+------------+---------------------+
    | membername | goodname | quantity | salesvalue | transdate           |
    +------------+----------+----------+------------+---------------------+
    | 张三       | book     |    1.000 |      89.00 | 2020-12-01 00:00:00 |
    +------------+----------+----------+------------+---------------------+
    1 row in set (0.00 sec)
    

    手动赋值字段做主键

    为了解决这个问题,想了一个办法:取消字段“id”的自增属性,改成信息系统在添加会员的时候对“id”进行赋值。

    具体的操作是这样的:在总部 MySQL 数据库中,有一个管理信息表,里面的信息包括成本核算策略,支付方式等,还有总部的系统参数,可以在这个表中添加一个字段,专门用来记录当前会员编号的最大值。

    门店在添加会员的时候,先到总部 MySQL 数据库中获取这个最大值,在这个基础上加 1,然后用这个值作为新会员的“id”,同时,更新总部 MySQL 数据库管理信息表中的当前会员编号的最大值。这样一来,各个门店添加会员的时候,都对同一个总部 MySQL 数据库中的数据表字段进行操作,就解决了各门店添加会员时会员编号冲突的问题,同时也避免了使用业务字段导致数据错误的问题。


    小结

    • 业务字段做主键,看起来很简单,但是应该尽量避免这样做。因为无法预测未来会不会因为业务需要,而出现业务字段重复或者重用的情况。
    • 自增字段做主键,对于单机系统来说是没问题的。但是,如果有多台服务器,各自都可以录入数据,那就不一定适用了。因为如果每台机器各自产生的数据需要合并,就可能会出现主键重复的问题。
    • 采用手动赋值的办法,通过一定的逻辑,确保字段值在全系统的唯一性,这样就可以规避主键重复的问题了。

    刚开始使用 MySQL 时,很多人都很容易犯的错误是喜欢用业务字段做主键,想当然地认为了解业务需求,但实际情况往往出乎意料,而更改主键设置的成本非常高。所以,如果系统比较复杂,尽量给表加一个字段做主键,采用手动赋值的办法,虽然系统开发的时候麻烦一点,却可以避免后面出大问题。


    给已有的字段增加主键:

    alter table demo.importhead modify listnumber int primary key;

    mysql> describe demo.importhead;
    +----------------+---------------+------+-----+---------+-------+
    | Field          | Type          | Null | Key | Default | Extra |
    +----------------+---------------+------+-----+---------+-------+
    | listnumber     | int           | YES  |     | NULL    |       |
    | supplierid     | int           | YES  |     | NULL    |       |
    | stocknumber    | int           | YES  |     | NULL    |       |
    | importtype     | int           | YES  |     | 1       |       |
    | importquantity | decimal(10,3) | YES  |     | NULL    |       |
    | importvalue    | decimal(10,2) | YES  |     | NULL    |       |
    | recorder       | int           | YES  |     | NULL    |       |
    | recordingdate  | datetime      | YES  |     | NULL    |       |
    +----------------+---------------+------+-----+---------+-------+
    8 rows in set (0.00 sec)
    
    mysql> alter table demo.importhead modify listnumber int primary key;
    Query OK, 0 rows affected (0.15 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> describe demo.importhead;
    +----------------+---------------+------+-----+---------+-------+
    | Field          | Type          | Null | Key | Default | Extra |
    +----------------+---------------+------+-----+---------+-------+
    | listnumber     | int           | NO   | PRI | NULL    |       |
    | supplierid     | int           | YES  |     | NULL    |       |
    | stocknumber    | int           | YES  |     | NULL    |       |
    | importtype     | int           | YES  |     | 1       |       |
    | importquantity | decimal(10,3) | YES  |     | NULL    |       |
    | importvalue    | decimal(10,2) | YES  |     | NULL    |       |
    | recorder       | int           | YES  |     | NULL    |       |
    | recordingdate  | datetime      | YES  |     | NULL    |       |
    +----------------+---------------+------+-----+---------+-------+
    8 rows in set (0.01 sec)
    
    展开全文
  • mysql如何给表设置组合主键

    千次阅读 2021-01-19 05:37:30
    2.设置联合主键;3.执行代码,发现出现错误;4.解决方案:给id自增列加UNIQUE唯一索引;5.代码执行成功;6.联合主键创建成功。7.SQL示例代码:USE testCREATE TABLE `test_table` (`id` INT(...
  • alter table interface_call_time_consuming drop id; -- 删除原来的主键值 alter table interface_call_time_consuming add id int not null primary key auto_increment first; -- 重新从1开始编号,使它连续
  • MySQL 自动编号主键约束

    千次阅读 2017-09-27 11:54:01
    1、自动编号,必须与主键配合使用 2、默认情况下,初始值1,每次的增量1
  • mysql主键非空约束怎么设置mysql中可以通过在“CREATE TABLE”语句中,使用“ PRIMARY KEY [默认值]”语句来设置主键约束,使用“ NOT NULL”语句来设置非空约束。mysql主键约束主键(PRIMARY KEY)的完整称呼是“主键...
  • mysql建表时设置主键的方法

    千次阅读 2021-02-02 09:04:51
    mysql建表时设置主键的方法发布时间:2020-10-10 15:17:28来源:亿速云阅读:119作者:小新mysql建表时设置主键的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给...
  • mysql自增主键设置

    千次阅读 2020-12-29 15:20:34
    mysql自增主键设置 在数据库应用中,经常希望在每次插入新纪录时,系统自动生成字段的主键值。可以通过主键添加AUTO_INCREMENT关键字来实现。 默认情况下,在MYSQL中AUTO_INCREMENT的初始值是1,每新增一条记录...
  • navicat怎么设置主键自增

    千次阅读 2021-01-19 20:43:49
    mysql数据库创建一张表之后,为了有一个标识某一条记录,一般都会有一个唯一id,这个id可以设置为主键和自增的方式,这样在插入新的记录的时候,都会随着之前的id自动递增。设置主键和自增可以通过sql的方式,也...
  • mysql建表时怎么设置主键

    千次阅读 2021-03-04 02:44:07
    设置方法:在“CREATE TABLE”语句中,通过“PRIMARY KEY”关键字来指定主键,语法格式“字段名 数据类型 PRIMARY KEY [默认值]”或“[CONSTRAINT 约束名] PRIMARY KEY 字段名”。主键(PRIMARY KEY)的完整称呼是...
  • MySql设置唯一标识,主键设置

    万次阅读 多人点赞 2018-07-23 12:16:34
    MySQL 每张表只能有1个自动增长字段,这个自动增长字段即可作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为设置为一种“键(key)”( 没有插入成功,但是自增长序列,还是会用...
  • 2设置主键和外键

    千次阅读 2020-10-14 19:13:40
    表已经创建成功的情况,如何设置主键和外键:alter table 表名 add primary key(字段名); alter table 从表名 add constraint fk_xx_xx foreign key(外键字段名) references 主表名(主键);删除主键和外键alter table...
  • mysql主键非空约束怎么设置

    千次阅读 2021-01-25 17:23:12
    一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。使用主键应注意以下几点:每个表只能定义一个主键主键值必须唯一标识表中的每一行,且不能 NULL,即表中不可能存在有相同主键值的...
  • 1.普通索引上存储的值是主键的值,如果主键是一个很长的字符串并且建了很多普通索引,将造成普通索引占有很大的物理空间2.自增ID 在插入的时候可以保证相邻的两条记录可能在同一个数据块,而订单号的连续性在设计上...
  • MySQL什么需要一个主键

    千次阅读 2021-01-28 17:40:58
    一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号。主键(primary key) 一列(或一组列),其值能够唯一区分表中的每个行。唯一标识表中每行的这个列(或这组列)称为主键。没有...
  • 需要在创建数据表的时候设置主键自增 (2) UUID (3) redis (4)MP自带的id生成 MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID 实体字段中配置 @TableId(type = IdType.AUTO) #全局设置主键生成策略 ...
  • 本文章是由一个简单的Mysql自增初始值的一个例子引导出大量的关于mysql主键获取 修改及一些常用的例子,下面我们一起来看看希望例子对各位会有帮助。alter table table_name auto_increment=n;注意n只能大于已有的...
  • SQL Server:主键与外键设置与相关理解

    千次阅读 2022-04-13 19:51:14
    个人在学习数据库基础操作时主键外键的设置,以及对于两者之间关系的模糊之处的理解与总结。
  • mysql生成随机主键编号

    千次阅读 2019-02-26 17:38:51
    select right(RAND(),16); select SUBSTR(RAND(),4);
  • 设置方法:在“CREATE TABLE”语句中,通过“PRIMARY KEY”关键字来指定主键,语法格式“字段名 数据类型 PRIMARY KEY [默认值]”或“[CONSTRAINT 约束名] PRIMARY KEY 字段名”。主键(PRIMARY KEY)的完整称呼是...
  • MySQL添加主键和外键

    千次阅读 2021-02-02 09:02:41
    primary key create table biao3 ( [No.] int primary key,--设置主键,唯一的,不能空,不能重复 name ), sex ), age int, bumen ), cid ) ) 可以把主键设置为自增长:在后面加 identity(1,1) 前面的数值是初始索引,...
  • 数据库主键为字母+数字 主键数字自增添加 数据库结构 mybatis部分代码 <select id="getId" resultType="java.lang.String"> SELECT IFNULL(( select tube_id from tp_tube where tube_id=(select tube...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,801
精华内容 33,920
关键字:

如何设置编号为主键