【问题标题】:Why the foreign key doesn't work between C# and MySql? [duplicate]为什么外键在 C# 和 MySql 之间不起作用? [复制]
【发布时间】:2019-05-26 22:33:30
【问题描述】:

They have relation between AuthorID and AID

I want to add attributes to 2 tables at the same time

'Cannot add or update a child row: a foreign key constraint fails (bibliographydb10.book, CONSTRAINT book_ibfk_1 FOREIGN KEY (AuthorID) REFERENCES author (AID))'

public static bool AddNewPackage(BookCitation package)
    {
        MySqlConnection connection = DataAccess.getConnection();

        string insertStatement =
            @"INSERT into Book (
                AuthorName,
                PubYear, 
                BookTitle, 
                PubCity,
                PubName,
                PageNumbers) 
                VALUES (
                @AuthorName,
                @PubYear, 
                @BookTitle, 
                @PubCity,
                @PubName,
                @PageNumbers);
                INSERT into Author (
                AID,
                AuthorNamee,
                Affiliation)
                VALUES (@AID, @AuthorNamee, @Affiliation)";
        MySqlCommand insertCommand = new MySqlCommand(insertStatement, connection);
        insertCommand.Parameters.AddWithValue("@AID", package.AID);
        insertCommand.Parameters.AddWithValue("@AuthorName", package.AuthorName);
        insertCommand.Parameters.AddWithValue("@AuthorNamee", package.AuthorNamee);
        insertCommand.Parameters.AddWithValue("@Affiliation", package.Affiliation);
        insertCommand.Parameters.AddWithValue("@PubYear", package.PublishYear);
        insertCommand.Parameters.AddWithValue("@BookTitle", package.BookTitle);
        insertCommand.Parameters.AddWithValue("@PubCity", package.PublisherCity);
        insertCommand.Parameters.AddWithValue("@PubName", package.Publisher);
        insertCommand.Parameters.AddWithValue("@PageNumbers", package.PageNumbers);

        try
        {
            connection.Open();
            insertCommand.ExecuteNonQuery();
            return true;
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.GetType() + ex.Message);
            return false;
        }
        finally
        {
            connection.Close();
        }

    }

public class BookCitation
{
    public int BookCID { get; set; }
    public int AID { get; set; }
    public string AuthorName { get; set; }
    public string AuthorNamee { get; set; }
    public string Affiliation { get; set; }
    public DateTime PublishYear { get; set; }
    public string BookTitle { get; set; }
    public string PublisherCity { get; set; }
    public string Publisher { get; set; }
    public string PageNumbers { get; set; }
}

如何使用外键添加 AuthorID?

【问题讨论】:

  • 您在package.AID 中有什么价值? Book 表上有AID 列吗?
  • 它是 AUTO_INCREMENT。如果我删除外键,我可以使用 authorID 添加到作者表,但书表的 AID 将为零 (0)。
  • @ChetanRanpariya 我改变了,但我认为没关系:'无法添加或更新子行:外键约束失败(bibliographydb10.book,CONSTRAINT book_ibfk_1 FOREIGN KEY (AID) REFERENCES author (AID))' 如果我删除外键 i.stack.imgur.com/H1CmK.jpg i.stack.imgur.com/Yg6N0.jpg
  • 这很重要。如果 Book 表中有 AID 列,并且它引用 Author 表,则不能在 AID 列中没有值的情况下在 book 表中插入行。在您的情况下,您首先需要在 Author 表中插入行并使用新作者的 AID 在 book 表中插入行。这是基于您到目前为止所解释的内容。我还是不知道你的表结构。
  • @ChetanRanpariya 好的,然后我做了“AID”​​而不是“AuthorID”,但仍然出现同样的错误“无法添加或更新子行:外键约束失败(bibliographydb10.book,CONSTRAINT book_ibfk_1 FOREIGN KEY(援助)参考作者(援助))'。这些是表结构i.stack.imgur.com/Bvdkp.jpgi.stack.imgur.com/SlAEq.jpg

标签: c# mysql visual-studio foreign-keys


【解决方案1】:

错误消息暗示作者必须首先存在。插入新作者,检索该新作者的 AID,然后插入新书,并将该书的 AID 列设置为与刚刚插入的新作者检索到的 AID 值相同的值

【讨论】:

  • 所以你是说你不能同时向 2 个关系表添加属性?
  • 这取决于您所说的“同时”是什么意思。通常,在数据库系统中,您必须按照先父后子的顺序插入一个表,然后再插入另一个表。这些插入之间可能只有几纳秒,但它们绝对是一次一个。如果您涉及事务,那么它们可以被认为是同时发生的,因为操作是原子的。最后一点,更强大的数据库可以进行延迟约束检查,因此您可以按照子后父的顺序执行插入,并且仅在提交时检查关系。 MySQL 无法做到这一点
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2017-06-25
  • 2015-12-08
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多