”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > [已解决] 完整性约束违规 – 快速提示

[已解决] 完整性约束违规 – 快速提示

发布于2024-08-25
浏览:931

如果您正在处理错误:“违反完整性约束:无法添加或更新子行:外键约束失败”,那么您阅读的是正确的文章。

通常,当您向表中添加新列并将其声明为外键时,您会遇到此错误。

在 SQL 数据库中,外键是表中的一个字段,用于在另一个表中的数据之间建立链接。考虑下面的客户表。

CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255)
);

现在您想要将您的客户链接到一个组。首先,您应该将新列添加到包含对组表的引用的客户表中:

# Create the new column "group_id"
ALTER TABLE customers
ADD COLUMN group_id INT NOT NULL;

您可以添加外键约束来激活与组表的关系:

# Add the FK constraints
ALTER TABLE customers
ADD CONSTRAINT fk_group_id
FOREIGN KEY (group_id)
REFERENCES customers(id);

当您对customers表运行此更改操作时,数据库将验证group_id字段中的ID是否存在于groups表中。

在此检查期间,数据库将引发“完整性违规错误”,因为 group_id 列仍然为空,因此它不包含 groups 表中的任何有效引用。因此 SQL 引擎无法尝试应用外键约束。这是因为空值不是组表的有效外键。

如何解决完整性违规错误

最简单的操作是将新列声明为可为空。

您可以从alter查询中删除“NOT NULL”指令,以允许group_id列包含空值。

这个简单的更改将首先解决问题,因为现在外键也可以为空。您可以运行数据迁移以最终填充客户表中的新 group_id 列,并计划新版本以重新引入“NOT NULL”约束。

如果在您的应用程序中,如果没有特定的组,客户就不能存在,您应该记住,如果 group_id 可以为空,您的数据库将不知道此约束。

如果您在应用程序中创建实体时犯了错误,数据库不会提醒您。

数据迁移

另一种解决方案是在用于添加新列的alter查询和用于添加外键的alter查询之间添加数据迁移作业。

在客户表中获得新的 group_id 列后,您可以运行脚本,使用 groups 表中的有效 ID 填充现有行的此列。

这是执行此任务的查询示例:

UPDATE customers, groups
SET customers.group_id = groups.id
Where customers.user_id = groups.user_id;

使用 Laravel 迁移

在现代应用程序中,所有这些任务都是使用迁移工具执行的。它通常在大多数常见的应用程序开发框架中可用。

在下面的示例中,我将向您展示如何使用 Laravel 迁移处理完整性约束违规问题。

创建迁移:

php artisan make:migration add_goup_id_fk_to_customers –table=customers

您可以将迁移分为两部分,如下所示:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->unsignedBigInteger('group_id')->nullable();
        });

        // Insert default data into the new column
        DB::raw('UPDATE customers, groups
            SET customers.group_id = groups.id
            WHERE customers.user_id = groups.user_id');

        Schema::table('customers', function (Blueprint $table) {
            // Add the FK constraint
            $table->foreign('group_id')->references('id')->on(groups)->onDelete('cascade');

            // Remove the nullable condition eventually;
            $table->unsignedBigInteger('group_id')->change();
        });



    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('customers', function (Blueprint $table) {
            $table->dropForeign('group_id');
            $table->dropColumn('group_id');
        });
    }
};

如果您对提高数据库性能感兴趣,可以看看下面关于“智能数据库查询”的文章:
https://inspector.dev/how-to-accelerate-application-performance-with-smart-sql-queries/

督察新人?免费监控您的应用程序

Inspector是专门为软件开发人员设计的代码执行监控工具。您无需在服务器级别安装任何内容,只需安装 composer 软件包 即可开始使用。

与其他复杂的一体化平台不同,Inspector 非常简单,并且对 PHP 友好。您可以尝试我们的 Laravel 或 Symfony 包。

如果您正在寻找有效的自动化、深入的见解以及将警报和通知转发到您的消息传递环境的能力,请免费尝试 Inspector。注册您的帐户。

或者在网站上了解更多信息:https://inspector.dev

[Resolved] Integrity constraint violation – Fast tips

版本声明 本文转载于:https://dev.to/inspector/resolved-integrity-constraint-violation-fast-tips-9eb?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-05-04
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-05-04
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-05-04
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。本文深入研究了eval()和ast.literal_eval()之间的差异,突出显示其安全性含义...
    编程 发布于2025-05-04
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-05-04
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-05-04
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-05-04
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-04
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-04
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-05-04
  • 在Oracle SQL中如何提取下划线前的子字符串?
    在Oracle SQL中如何提取下划线前的子字符串?
    [ 在oracle sql 解决方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    编程 发布于2025-05-04
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-04
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-05-04
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-05-04
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-05-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3