sql server对已创建的表增加属性(自动增序)

本文介绍如何在SQL Server中为已存在的表添加自增ID字段,并将其设置为主键。通过使用ALTER TABLE命令添加带有IDENTITY属性的字段,然后调整主键设置。

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


新建此表时把ID设为INT类型,然后设Identity为yes,种子为1递增就可以了.
如果这张表已经建了,你在最后加一个字段叫ID,然后和上面一样操作,然后保存即可自增.(一定要设置完在保存)

             alter table student add id int identity(1,1)

 

保存后新增了一列id,在表 设计 里把原主键删掉,把id移到第一列位置,id设置为主键即可。

 

注意:identity最好用在所有数据都创建好最后添加,不然序号改变不了还占用内存

转载于:https://www.cnblogs.com/aixiao07/p/8861934.html

<think>在SQL中,要实现自动的编号,通常使用自字段(AUTO_INCREMENT在MySQL中,IDENTITY在SQL Server中,SERIAL在PostgreSQL中,AUTOINCREMENT在SQLite中)。下面分别以几种常见的数据库为例:###1.MySQL在MySQL中,使用`AUTO_INCREMENT`关键字。```sqlCREATETABLE users(id INTNOT NULLAUTO_INCREMENT,username VARCHAR(50) NOTNULL,passwordVARCHAR(50)NOT NULL,PRIMARY KEY(id) );``` ###2. SQLServerSQLServer中,使用`IDENTITY(起始值,)`。```sqlCREATETABLE users(id INTIDENTITY(1,1) PRIMARYKEY,usernameVARCHAR(50)NOT NULL,password VARCHAR(50) NOTNULL); ```###3.PostgreSQL在PostgreSQL中,可以使用`SERIAL`类型(它实际上是整数类型,并自动创建一个列)。 ```sqlCREATE TABLEusers (idSERIALPRIMARY KEY,username VARCHAR(50) NOTNULL,passwordVARCHAR(50)NOT NULL);``` ###4. SQLite在SQLite中,使用`AUTOINCREMENT`关键字(注意:SQLite默认的ROWID已经可以自动,使用AUTOINCREMENT可以保证编号不会重复使用,但通常可以不使用,除非有特殊要求)。 ```sqlCREATE TABLEusers (idINTEGER PRIMARYKEY AUTOINCREMENT,username TEXTNOT NULL,password TEXTNOT NULL);``` ###解释: -在以上例子中,`id`列被设置为自动的主键。-每次插入新记录时,数据库自动为`id`列生成一个唯一的递值。-通常,起始值为1,每次增加1。如果需要不同的起始值和量,可以在创建时指定(如SQL Server中的`IDENTITY(10,2)`示从10开始,每次增加2)。###注意事项:1.**主键约束**:自动的列通常被设置为主键,以确保唯一性。 2. **插入操作**:在插入数据时,不需要为自动列指定值(或指定为NULL),数据库自动处理。3.**获取最后插入的ID**:在插入操作后,可能需要获取最后生成的ID(例如,在应用程中用于后续操作)。不同数据库有不同的方法:- MySQL: `LAST_INSERT_ID()`-SQL Server: `SCOPE_IDENTITY()`- PostgreSQL: `RETURNING id`(在插入语句后)- SQLite:`last_insert_rowid()` ###示例插入语句(MySQL):```sqlINSERTINTO users(username, password) VALUES('john_doe', 'password123'); ```###跨数据库考虑:如果应用程需要支持多种数据库,建议使用ORM(对象关系映射)工具(如EntityFramework,Hibernate等)来管理主键的自动生成,这样可以避免直接编写特定于数据库SQL语句。 §§相关问题§§: 1.如何在插入数据后获取自ID的值(针对不同的数据库)? 2.自字段在分布式系统中可能遇到的问题有哪些? 3.如何重置自字段的起始值? 4.除了自字段,还有哪些方法可以生成唯一的主键?</think>在 SQL 中实现自动的编号通常使用自字段(也称为标识列或列)。不同数据库系统有不同的实现方式,以下是主流数据库的实现方法: ### 1. MySQL/MariaDB 使用 `AUTO_INCREMENT` 属性: ```sql CREATE TABLE employees ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, position VARCHAR(100), PRIMARY KEY (id) ); ``` **解释:** - `AUTO_INCREMENT` 属性使字段值自动 - 每次插入新记录时自动生成下一个 ID(从 1 开始) - 必须与 `PRIMARY KEY` 或 `UNIQUE` 约束一起使用 ### 2. SQL Server 使用 `IDENTITY(起始值, )` 属性: ```sql CREATE TABLE employees ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(100) NOT NULL, position VARCHAR(100) ); ``` **解释:** - `IDENTITY(1,1)` 示从 1 开始,每次增加 1 - 可以自定义起始值和量(如 `IDENTITY(100,2)` 从 100 开始,每次加 2) ### 3. PostgreSQL 使用 `SERIAL` 类型或 `IDENTITY` 列: **方法 1:使用 SERIAL** ```sql CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, position VARCHAR(100) ); ``` **方法 2:使用 IDENTITY(推荐,符合 SQL 标准)** ```sql CREATE TABLE employees ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name VARCHAR(100) NOT NULL, position VARCHAR(100) ); ``` **解释:** - `SERIAL` 是 PostgreSQL 的便捷语法,实际创建了一个列 - `GENERATED ALWAYS AS IDENTITY` 是 SQL 标准方法,更推荐使用 ### 4. Oracle 使用列(Sequence)和触发器(Trigger): ```sql -- 创建列 CREATE SEQUENCE employee_seq START WITH 1 INCREMENT BY 1; -- 创建 CREATE TABLE employees ( id NUMBER PRIMARY KEY, name VARCHAR2(100) NOT NULL, position VARCHAR2(100) ); -- 创建触发器 CREATE OR REPLACE TRIGGER employee_bir BEFORE INSERT ON employees FOR EACH ROW BEGIN SELECT employee_seq.NEXTVAL INTO :new.id FROM dual; END; / ``` **解释:** - Oracle 使用列对象生成唯一值 - 触发器在插入前自动获取下一个列值 ### 5. SQLite 使用 `AUTOINCREMENT` 关键字: ```sql CREATE TABLE employees ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, position TEXT ); ``` **解释:** - 必须使用 `INTEGER` 类型(不能用 `INT`) - 自动从当前最大值+1 开始(如果删除记录,不会重用已删除的 ID) ### 通用最佳实践 1. **命名规范**:自字段通常命名为 `id` 2. **主键约束**:总是设为 `PRIMARY KEY` 3. **避免手动赋值**:插入数据时不要指定自字段的值 4. **插入示例**: ```sql INSERT INTO employees (name, position) VALUES ('张三', '工程师'); ``` ### 注意事项 - 不同数据库的语法差异较大 - 自字段通常用于代理主键(无业务意义) - 在分布式系统中,自ID可能不是最佳选择(考虑UUID等方案) - 删除记录后,自值不会重置(除非手动重建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值