SQL如何插入字段说明

Oracle
通过 COMMENT ON TABLE  /  COMMENT ON COLUMN 追加表/字段的备注。
CREATE TABLE "MR_DEPT" (
	"DEPT_ID" NUMBER NOT NULL ,
	"PARENT_ID" NUMBER,
	"DEPT_NAME" CHAR(20) NOT NULL ,
	"STATUS" NUMBER DEFAULT 1 NOT NULL ,
PRIMARY KEY ("DEPT_ID") 
) 
/
COMMENT ON TABLE "MR_DEPT" IS '部门表'
/
COMMENT ON COLUMN "MR_DEPT"."DEPT_ID" IS '部门编号'
/
COMMENT ON COLUMN "MR_DEPT"."PARENT_ID" IS '上级部门编号'
/
COMMENT ON COLUMN "MR_DEPT"."DEPT_NAME" IS '部门名'
/
COMMENT ON COLUMN "MR_DEPT"."STATUS" IS '状态'
/

SQL Server  通过存储过程追加
CREATE TABLE test_table(
  Test_ID int IDENTITY(1,1)  PRIMARY KEY  NOT NULL ,
  Test_Key varchar(10) NOT NULL ,
  Test_Value varchar(20) NOT NULL 
);
go

EXECUTE sp_addextendedproperty N'MS_Description', '测试表',  N'user',  N'dbo',  N'Table', N'test_table', NULL, NULL;
go

EXECUTE sp_addextendedproperty   N'MS_Description', '主键(自增长)',   N'user',  N'dbo',  N'Table', N'test_table', N'column' , N'Test_ID';
go

EXECUTE sp_addextendedproperty   N'MS_Description', '种类',   N'user',  N'dbo',  N'Table', N'test_table', N'column' , N'Test_Key';
go

EXECUTE sp_addextendedproperty   N'MS_Description', '数值',   N'user',  N'dbo',  N'Table', N'test_table', N'column' , N'Test_Value';
go

MySQL 包含在建表语句中。
CREATE TABLE test_table(
  Test_ID int NOT NULL  AUTO_INCREMENT  PRIMARY KEY  COMMENT  '主键(自增长)' ,
  Test_Key varchar(10) NOT NULL  COMMENT  '种类' ,
  Test_Value varchar(20) NOT NULL  COMMENT  '数值' 
)
COMMENT = '测试表'
sql添加表列字段描述添加默认值删除字段 //删除表 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[JHCRM_Report_ss]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [JHCRM_Report_ss] //添加表 if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) create table [Table1] ([col1] int,[col2] int) //添加字段 if not exists( select * from syscolumns where syscolumns.[name]='FNewObjectEnd' and syscolumns.[id]=(select id from dbo.sysobjects where id=object_id(N'[dbo].[jsc_financial]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) ) ALTER TABLE jsc_financial ADD FNewObjectEnd int--NULL --添加先用项目结项数 go EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'先用项目结项数' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'jsc_financial', @level2type=N'COLUMN',@level2name=N'FNewObjectEnd' if not exists( select * from syscolumns where syscolumns.[name]='Record_Money' and syscolumns.[id]=(select id from dbo.sysobjects where id=object_id(N'[dbo].[JHCRM_Resource_Record_Main]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) ) ALTER TABLE JHCRM_Resource_Record_Main ADD Record_Money numeric(12, 2)--NULL --资源费用 go EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'资源费用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'JHCRM_Resource_Record_Main', @level2type=N'COLUMN',@level2name=N'Record_Money' //删除字段 if not exists( select * from syscolumns where syscolumns.[name]=table_Name and syscolumns.[id]=(select id from dbo.sysobjects where id=object_id(N'[dbo].[tableName]')" and OBJECTPROPERTY(id, N'IsUserTable') = 1) ) ALTER TABLE table_Name DROP COLUMN tableName
<think> 嗯,用户这次的问题很明确,就是要了解SQL Server中向字段插入数据的方法。虽然站内引用提到了自增长字段的特殊操作,但用户的实际需求更基础全面。 从用户提问的简洁程度来看,ta可能是个初学者,需要系统性的指导。不过用户特意提到"字段插入数据"而非"表插入数据",说明已经有一定基础概念,知道数据是插入到特定字段的。 考虑到用户之前没有对话历史,我决定从最基础的INSERT语法讲起,但跳过建表等前置知识。重点覆盖这几个层面: 基础单条插入 → 批量插入 → 特殊字段处理(正好引用里提到的自增字段也属于这类)→ 性能优化提示。这样阶梯式展开比较符合学习路径。 那个自增字段的引用虽然不完全匹配需求,但可以转化为"特殊字段处理"的案例。用户可能遇到标识列插入的坑,提前说明SET IDENTITY_INSERT的用法会很实用。不过要把这个技术点放在进阶部分,避免初学者混淆。 需要警惕的是不能直接照搬引用内容。原文用删除数据导致标识列不连续的例子其实不太恰当——数据库本来就不保证标识列连续,这个"问题"通常不需要解决。应该更强调何时需要手动插入标识列,比如数据迁移场景。 最后考虑设计几个自然延伸的问题:第一个问题延续基础操作,第二个针对特殊字段,第三个则是性能层面。这样既帮助用户深化学习,又能试探ta的真实水平。 </think> 好的,在 SQL Server 中向数据表的特定字段(列)插入数据,最核心的方法是使用 `INSERT INTO` 语句。根据你的具体需求,有以下几种常见用法: ### 1. 插入完整的行(指定所有列) 如果知道表中所有列的值,并且想为每一列都插入数据(包括标识列以外的所有列),可以使用最简单的语法: ```sql INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...); ``` * **`表名`**: 要插入数据的目标表名称。 * **`(列1, 列2, 列3, ...)`**: 指定要插入数据的列名列表(推荐显式列出列名,避免依赖表结构顺序)。 * **`VALUES (值1, 值2, 值3, ...)`**: 提供与列列表一一对应的值列表。值的顺序、数量和数据类型必须与列列表严格匹配。 * **示例**: ```sql INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway'); ``` ### 2. 插入部分列(省略可为NULL或有默认值的列) 如果只想为部分列插入数据(其他列要么允许 `NULL`,要么有默认值约束),只需在列列表中指定这些列,并在 `VALUES` 子句中提供对应的值: ```sql INSERT INTO 表名 (列1, 列2, ...) -- 只指定需要插入数据的列 VALUES (值1, 值2, ...); -- 提供对应的值 ``` * **示例** (假设 `PostalCode` 列允许 `NULL`): ```sql INSERT INTO Customers (CustomerName, City, Country) VALUES ('Greasy Burger', 'Oslo', 'Norway'); -- 未指定的 Address, ContactName, PostalCode 将插入 NULL 或默认值 ``` ### 3. 插入多行数据 可以在一个 `INSERT` 语句中一次性插入多行数据,使用逗号分隔多个 `VALUES` 子句: ```sql INSERT INTO 表名 (列1, 列2, ...) VALUES (值1a, 值2a, ...), -- 第一行 (值1b, 值2b, ...), -- 第二行 ... -- 更多行 ; ``` * **示例**: ```sql INSERT INTO Products (ProductName, SupplierID, CategoryID, Unit, Price) VALUES ('Chais', 1, 1, '10 boxes x 20 bags', 18), ('Chang', 1, 1, '24 - 12 oz bottles', 19), ('Aniseed Syrup', 1, 2, '12 - 550 ml bottles', 10); ``` ### 4. 从另一个表插入数据(`INSERT INTO SELECT`) 可以将一个查询的结果集直接插入到另一个表中。这是插入大量数据或数据迁移的常用方法。 ```sql INSERT INTO 目标表名 (目标列1, 目标列2, ...) SELECT 源列1, 源列2, ... FROM 源表名 [WHERE 条件]; -- 可选,筛选要插入的数据 ``` * **要求**: * 目标表和源表可以相同也可以不同。 * `SELECT` 语句返回的列数、顺序和数据类型必须与 `INSERT INTO` 子句指定的目标列列表兼容。 * **示例** (将 `Suppliers` 表中来自德国的供应商插入到 `GermanyCustomers` 表): ```sql INSERT INTO GermanyCustomers (CustomerName, City, Country) SELECT SupplierName, City, Country FROM Suppliers WHERE Country = 'Germany'; ``` ### ✅ 关键注意事项:处理标识列(自增长列) * 默认情况下,**不能**为定义为 `IDENTITY`(标识列/自增长列)的字段手动指定值。数据库引擎会自动为其生成唯一的值。 * 如果**必须**手动插入或更新标识列的值(例如数据修复、迁移等特殊场景),需要**临时启用对该表的标识列插入权限**,使用 `SET IDENTITY_INSERT` 命令:[^1] ```sql SET IDENTITY_INSERT 表名 ON; -- 启用手动插入标识列 INSERT INTO 表名 (标识列名, 其他列1, 其他列2, ...) -- 必须显式列出标识列 VALUES (手动指定的标识值, 值1, 值2, ...); SET IDENTITY_INSERT 表名 OFF; -- 务必记得关闭! ``` * `SET IDENTITY_INSERT [ON|OFF]` 是连接级别的设置。 * 一次只能为一个表启用 `IDENTITY_INSERT`。 * 插入时必须显式列出标识列名。 * 手动指定的值必须唯一(不能与现有值冲突)且符合标识列的数据类型规则。 * **务必在执行完手动插入操作后立即将其关闭 (`OFF`)**,以避免影响后续正常的自动插入操作。 ### 总结核心方法 | 方法 | 语法关键字 | 适用场景 | 处理标识列 | | :------------------- | :---------------------- | :------------------------------------------- | :------------------------ | | **插入完整行** | `INSERT INTO ... VALUES` | 插入单行,指定所有列值 | 不能指定值 | | **插入部分列** | `INSERT INTO ... VALUES` | 插入单行,只提供部分列值 | 不能指定值 | | **插入多行** | `INSERT INTO ... VALUES(...), (...)` | 一次性插入多行数据 | 不能指定值 | | **从查询结果插入** | `INSERT INTO ... SELECT ...` | 将另一个表或查询结果插入目标表(批量/迁移) | SELECT 不能选标识列源值 | | **手动插入标识列** | `SET IDENTITY_INSERT ... ON; INSERT ...; SET ... OFF;` | **特殊场景**需手动控制标识列值 | **必须显式指定值** | 选择哪种方法取决于你需要插入的数据来源(手动输入值、来自另一个表/查询)和数量(单行、多行、批量),以及是否需要操作标识列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值