【数据库_Postgresql】数据库主键自增长之加序列和不加序列2种方法

本文介绍了一种在数据库中实现表主键自动递增的方法,通过创建序列和表结构关联来确保主键唯一并自动增长。此外还提供了一种不使用序列时通过子查询实现id自增的方式。

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

将表的主键进行序列增加之后可以在数据库层面自动主键id增长

方法如下:先建序列,然后建表关联id主键,然后添加语句,不用考虑id主键

 

DROP SEQUENCE
IF EXISTS "public"."sp_warehouse_id_seq";

CREATE SEQUENCE "public"."sp_warehouse_id_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;

DROP TABLE
IF EXISTS "public"."sp_warehouse";

CREATE TABLE "public"."sp_warehouse" (
"id" NUMERIC (10) DEFAULT nextval(
'sp_sn_main_id_seq' :: regclass
) NOT NULL,
"whid" VARCHAR (20) COLLATE "default",
"whname" VARCHAR (50) COLLATE "default",
"province" VARCHAR (20) COLLATE "default",
"city" VARCHAR (20) COLLATE "default",
"district" CHAR (20) COLLATE "default",
"addr" TEXT COLLATE "default"
) WITH (OIDS = FALSE);

INSERT INTO "public"."sp_warehouse" (

"whid",
"whname",
"province",
"city",
"district",
"addr"
)
VALUES
(
'whid1',
'ads',
'dsf',
'sdf',
'dsf ',
'sdf'
);

 

不用序列的话可以在sql中id部分加一句子查询,例如:

<insert id="insertSelective" parameterType="java.util.Map">

        INSERT INTO sp_sn_main
        <trim prefix="(" suffix=")" suffixOverrides=",">
        snmasterid,
            <if test="snnumber != null">
                snnumber,
            </if>
            <if test="whid != null">
                whid,
            </if>
            <if test="itemnumber != null">
                itemnumber,
            </if>
            <if test="inboundnumber != null">
                inboundnumber,
            </if>
            <if test="outboundnumber != null">
                outboundnumber,
            </if>
            <if test="inbounddate != null">
                inbounddate,
            </if>
            <if test="outbounddate != null">
                outbounddate,
            </if>
            <if test="employeeid != null">
                employeeid,
            </if>
            <if test="status != null">
                status,
            </if>

        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
        
        (
            (
                SELECT
                    MAX (snmasterid)
                FROM
                    sp_sn_main
            ) + 1
        ),
            <if test="snnumber != null">
                #{snnumber,jdbcType=VARCHAR},
            </if>
            <if test="whid != null">
                #{whid,jdbcType=VARCHAR},
            </if>
            <if test="itemnumber != null">
                #{itemnumber,jdbcType=VARCHAR},
            </if>
            <if test="inboundnumber != null">
                #{inboundnumber,jdbcType=VARCHAR},
            </if>
            <if test="outboundnumber != null">
                #{outboundnumber,jdbcType=VARCHAR},
            </if>
            <if test="inbounddate != null">
                #{inbounddate,jdbcType=DATE},
            </if>
            <if test="outbounddate != null">
                #{outbounddate,jdbcType=DATE},
            </if>
            <if test="employeeid != null">
                #{employeeid,jdbcType=VARCHAR},
            </if>
            <if test="status != null">
                #{status,jdbcType=VARCHAR},
            </if>

        </trim>
    </insert>

 

转载于:https://www.cnblogs.com/dflmg/p/6641183.html

<think>嗯,用户想在数据库中定义一个id字段作为自主键且非空。首先,我得回忆一下数据库系统的语法差异。比如,MySQL用的是AUTO_INCREMENT,而PostgreSQL是SERIAL或者IDENTITY,SQLite则是AUTOINCREMENT。用户提到的引用里提到SQLite推荐用AUTOINCREMENT,这点要注意。 接下来,主键约束默认就是非空的,所以只要设置为主键,非空应该可以省略。过用户明确要求非空,可能还是需要显式声明,确保万无一失。例如在MySQL中,虽然主键自动非空,但显式上NOT NULL也没问题。 然后,我需要考虑联合主键的情况,但用户只需要单个字段作为主键,所以没问题。引用[1]提到联合主键也是一个主键,但这里需要。另外,自列的设置方式,数据库同的实现,比如SQL Server用IDENTITY(1,1),Oracle用序列触发器,但用户可能更关心常见系统如MySQLPostgreSQLSQLite。 用户提供的引用中有关于自字段的内容,引用[3]提到SQLite推荐使用AUTOINCREMENT,所以可能需要用INTEGER PRIMARY KEY来隐式自。同时,引用[4]说明设置非空的情况,添加列时可以直接设置NOT NULL。 因此,正确的步骤应该是:定义id字段为主键,并设置自属性,同时确保非空。在大多数数据库中,主键默认非空,所以可能需要显式写NOT NULL,但上会更清晰。然后根据数据库的语法来调整自的关键字。 最后,可能需要提醒用户注意数据库的语法差异,以及自机制的具体实现,比如MySQL的AUTO_INCREMENTPostgreSQL的SERIAL或IDENTITY。另外,检查是否有其他约束或索引需要处理,比如删除主键时的注意事项,如引用[2]所说,删除主键需要指定名字,但用户这里是创建,所以需要考虑这点。</think>在数据库中定义 `id` 字段为自主键且非空时,需根据具体数据库系统的语法实现。以下是常见数据库的实现方法及注意事项: ### 1. **MySQL** ```sql CREATE TABLE table_name ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, ... ); ``` - `AUTO_INCREMENT` 定义自属性[^2] - `PRIMARY KEY` 隐式包含非空约束[^1],但显式声明 `NOT NULL` 可强可读性 - 主键唯一性由数据库自动保证 ### 2. **PostgreSQL** ```sql CREATE TABLE table_name ( id SERIAL PRIMARY KEY, ... ); ``` - `SERIAL` 是伪类型,实际等价于 `INT GENERATED BY DEFAULT AS IDENTITY`[^3] - 主键自动包含非空约束,无需额外声明 ### 3. **SQLite** ```sql CREATE TABLE table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT, ... ); ``` - 必须显式使用 `AUTOINCREMENT` 关键字(但通常推荐仅用 `INTEGER PRIMARY KEY` 实现隐式自) - 主键自动非空 ### 4. **SQL Server** ```sql CREATE TABLE table_name ( id INT IDENTITY(1,1) PRIMARY KEY NOT NULL, ... ); ``` - `IDENTITY(1,1)` 定义从1开始的自序列 - 主键与非空约束需分开声明 ### 关键注意事项 1. 主键约束默认包含非空约束,但显式声明 `NOT NULL` 可避免歧义[^4] 2. 自字段的值由数据库自动管理,插入时无需指定 3. 数据库的自实现机制差异较大(如Oracle需使用序列+触发器)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值