Member 13771716 Ответов: 1

Как я могу сделать значение первичного ключа таким же, как внешний ключ в другой таблице?


Привет, в настоящее время у меня есть ASP.NET веб-приложение, которое захватывает входные данные пользователей и помещает их в базу данных.

У меня есть две таблицы "Stock_Take" и "Stock_Take_Item", Stock_Take хранит информацию о пользователе, который представил значения и дату взятия акций, а stock_take_item хранит информацию об идентификаторе товара, описании товара и количестве относительно каждого товара.

Первичный ключ Stock_Take-это StockTakeIDNew и автоинкременты с использованием 'Identity', а также внешний ключ в таблице Stock_Take_Item.

Когда я вставляю всю информацию из запаса (одним нажатием кнопки), я вставляю только имя пользователя и дату в Stock_Take, а первичный ключ автоматически увеличивается. Однако это не влияет на внешний ключ в таблице Stock_Take_Item, поэтому я не могу связать эти две таблицы.

Есть идеи, как мне это сделать?

Вот мой код C# с включенными вставками SQL:
protected void btnSubmit_Click(object sender, EventArgs e)
       {
       string query = "insert into Stock_Take_Item(ItemID, BarQuantity, StorageQuantity) values(@ID, @BAR, @STORAGE); insert into Stock_Take(Username, StockDate)" +
           " values(@Username, GetDate())";
       SqlConnection con = new SqlConnection(connectionString);
       SqlCommand cmd = new SqlCommand(query, con);
       con.Open();

       foreach (GridViewRow row in gvStockTake.Rows)
       {
           Label ID = row.FindControl("itemId") as Label;
           TextBox BAR = row.FindControl("txtBar") as TextBox;
           TextBox STORAGE = row.FindControl("txtStorage") as TextBox;
           cmd.Parameters.Clear();
           cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
           cmd.Parameters.Add("@BAR", SqlDbType.Int).Value = BAR.Text;
           cmd.Parameters.Add("@STORAGE", SqlDbType.Int).Value = STORAGE.Text;

       }
       cmd.Parameters.AddWithValue("@Username", Session["username"]);
       cmd.ExecuteNonQuery(); //query execution
       con.Close();
       Response.Write("Successfully inserted stock take items.");
   }


Я все еще учусь ASP.NET C# и SQL, как я иду, так что любые рекомендации более чем ценятся!!

Что я уже пробовал:

Я пытался исследовать это, но не смог найти правильного результата.

F-ES Sitecore

У вас есть две таблицы, так что вам нужно сделать, чтобы вставки. Сначала вставьте в родительскую таблицу (stock_take) и получите идентификатор новой записи

https://stackoverflow.com/questions/18373461/execute-insert-command-and-return-inserted-id-in-sql?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

теперь у вас есть идентификатор, который вы можете использовать при вставке в дочернюю таблицу Stock_Take_Item, чтобы связать их вместе.

1 Ответов

Рейтинг:
1

OriginalGriff

Идея внешнего ключа заключается в том, что он связывает несколько строк с данными в другой таблице. Например, подумайте о счете-фактуре. Он состоит из invfo, имеющего отношение ко всему счету-фактуре, например к номеру счета-фактуры и дате его выдачи, а также набора строк для каждого приобретенного товара:

Invoice number: 12345
Invoice Date:   12/04/2018
Customer:       Joe's Shoes, Shoe House, Shoe Lane, Shoeton

Qty    Desc                 Price Per     Total
1      Laces                    $5.00     $5.00
2      Shoe polish              $7.00    $14.00
Чтобы сохранить это, вы устанавливаете таблицы:
Счета-фактуры
ID           PRIMARY KEY
InvoiceNumber
Date
CustomerID
InvoiceLines
ID           PRIMARY KEY
InvoiceID    FOREIGN KEY to Invoices.ID
ItemsCount
Description
Price
Сначала создается элемент счета-фактуры, а затем с помощью идентификатора устанавливается значение внешнего ключа для каждой строки таблицы InvoiceLines.
Это не происходит автоматически - вы забираете счета.Значение ID из БД после вставки строки, как правило, с помощью значения @@IDENTITY или SCOPE_IDENTITY: @@IDENTITY (Transact-SQL) | Microsoft Docs[^]. Обычно весь набор операций вставки содержится в транзакции для обеспечения целостности базы данных, если возникает проблема.

Лично я предпочитаю использовать идентификаторы на основе GUID вместо IDENTITY и назначать значение ID из презентационного программного обеспечения вместо того, чтобы полагаться на увеличивающиеся значения - если ничего другого, то это не подразумевает никакого порядка или отсутствия "пробелов", которые делает IDENTITY (и не должны использоваться для)