自动增量:SQL Server

如何解决自动增量:SQL Server

我有一个表(Table1),其中有一个auto_increment ID列作为主键,并且运行良好。我还有另一个表(Table2),该表使用Table1中的ID列进行外键操作。

现在,当我查看表2中的记录时,在NULL列中看到了ID,但没有得到自动生成的数字。我还尝试了Identity(1,1),并看到了相同的结果。

我该如何解决?

作为后续,假设我将一个新列添加到现有表中,并希望为它提供1到20之间的值。

解决方法

如Joel所述,约束值不会自动从一个表插入到另一个表。如果Table2中的外键是Table1中的主键值,那么在将新行插入@ Table2中之前,您将需要捕获@ Table1的主键值。

这是执行此操作的常用方法。您可以在SSMS中运行此示例。

/* Create a mock-up of Table1 and Table2 */
DECLARE @Table1 TABLE ( 
    Table1_Value VARCHAR(50),pk_Table1 INT IDENTITY (1,1) NOT NULL PRIMARY KEY 
);

DECLARE @Table2 TABLE ( 
    fk_Table1 INT,Table2_Value VARCHAR(50),pk_Table2 INT IDENTITY (999,1) NOT NULL PRIMARY KEY 
);

声明一个表变量(@out)以在插入行时捕获Table1的主键值:

/* Declare an OUTPUT table to capture the PK of the value inserted into @Table1 */
DECLARE @out TABLE ( pk_Table1 INT );

一旦有了这些东西,就可以在Table1中插入新行并捕获其主键值了。

/* Insert a value into @Table1 and capture its PK */
INSERT INTO @Table1 ( Table1_Value ) 
OUTPUT inserted.pk_Table1 INTO @out
VALUES
    ( 'Table1_Value01' );

这里要注意的是这个人:

OUTPUT inserted.pk_Table1 INTO @out

这使我们能够捕获插入到表1中的任何值,但是在这种情况下,我们关心的是pk_Table1

如果我们查看@out的结果集:

/* Show the results captured in @out */
SELECT * FROM @out;

我们看到以下内容:

+-----------+
| pk_Table1 |
+-----------+
|         1 |
+-----------+

查看@Table1的结果集:

/* Show the @Table1 resultset */
SELECT * FROM @Table1 ORDER BY pk_Table1;

返回:

+----------------+-----------+
|  Table1_Value  | pk_Table1 |
+----------------+-----------+
| Table1_Value01 |         1 |
+----------------+-----------+

现在我们已经捕获了Table1的新行的主键,我们可以将新行插入到@Table2中,并将其值重新绑定到@Table1

/* Insert a new value into @Table2 with a foreign key value pointing to @Table1 */
INSERT INTO @Table2 ( fk_Table1,Table2_Value )
    VALUES ( ( SELECT pk_Table1 FROM @out ),'Table2 value related to Table1 value.' );

这个家伙...

( SELECT pk_Table1 FROM @out )

返回将行插入@Table1时捕获的主键值。

如果我们查看@Table2的结果集:

/* Show the @Table2 resultset */
SELECT * FROM @Table2 ORDER BY pk_Table2;

我们看到了:

+-----------+---------------------------------------+-----------+
| fk_Table1 |             Table2_Value              | pk_Table2 |
+-----------+---------------------------------------+-----------+
|         1 | Table2 value related to Table1 value. |       999 |
+-----------+---------------------------------------+-----------+

最后,我们可以根据它们之间的关系将两个表连接在一起:

/* Join the two tables based on their relationship */
SELECT
    t1.pk_Table1,t1.Table1_Value,t2.fk_Table1,t2.pk_Table2,t2.Table2_Value
FROM @Table1 AS t1
INNER JOIN @Table2 AS t2
    ON t1.pk_Table1 = t2.fk_Table1
ORDER BY
    t1.pk_Table1;

哪个返回:

+-----------+----------------+-----------+-----------+---------------------------------------+
| pk_Table1 |  Table1_Value  | fk_Table1 | pk_Table2 |             Table2_Value              |
+-----------+----------------+-----------+-----------+---------------------------------------+
|         1 | Table1_Value01 |         1 |       999 | Table2 value related to Table1 value. |
+-----------+----------------+-----------+-----------+---------------------------------------+

显然,这不是深入探讨基于唯一值关联两个表的方法,但是很容易理解。

以下是您可以在SSMS中运行的完整示例:

/* Create a mock-up of Table1 and Table2 */
DECLARE @Table1 TABLE ( 
    Table1_Value VARCHAR(50),1) NOT NULL PRIMARY KEY 
);

/* Declare an OUTPUT table to capture the PK of the value inserted into @Table1 */
DECLARE @out TABLE ( pk_Table1 INT );

/* Insert a value into @Table1 and capture its PK */
INSERT INTO @Table1 ( Table1_Value ) 
OUTPUT inserted.pk_Table1 INTO @out
VALUES
    ( 'Table1_Value01' );

/* Show the results captured in @out */
SELECT * FROM @out;

/* Show the @Table1 resultset */
SELECT * FROM @Table1 ORDER BY pk_Table1;

/* Insert a new value into @Table2 with a foreign key value pointing to @Table1 */
INSERT INTO @Table2 ( fk_Table1,'Table2 value related to Table1 value.' );

/* Show the @Table2 resultset */
SELECT * FROM @Table2 ORDER BY pk_Table2;

/* Join the two tables based on their relationship */
SELECT
    t1.pk_Table1,t2.Table2_Value
FROM @Table1 AS t1
INNER JOIN @Table2 AS t2
    ON t1.pk_Table1 = t2.fk_Table1
ORDER BY
    t1.pk_Table1;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-