SQL Insert into Entry Tables [дубликат]

Если у вас уже есть ваши параметры, например $ _POST ['eg'], и вы не хотите его менять, просто сделайте это так:

$_POST = json_decode(file_get_contents('php://input'), true);

Это спасет вас хлопот об изменении всего $ _POST на что-то еще и позволяет вам делать обычные почтовые запросы, если вы хотите вывести эту строку.

113
задан 4 revs 23 October 2008 в 10:38
поделиться

11 ответов

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

DECLARE @Object_Table TABLE
(
    Id INT NOT NULL PRIMARY KEY
)

DECLARE @Link_Table TABLE
(
    ObjectId INT NOT NULL,
    DataId INT NOT NULL
)

DECLARE @Data_Table TABLE
(
    Id INT NOT NULL Identity(1,1),
    Data VARCHAR(50) NOT NULL
)

-- create two objects '1' and '2'
INSERT INTO @Object_Table (Id) VALUES (1)
INSERT INTO @Object_Table (Id) VALUES (2)

-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')

-- link all data to first object
INSERT INTO @Link_Table (ObjectId, DataId)
SELECT Objects.Id, Data.Id
FROM @Object_Table AS Objects, @Data_Table AS Data
WHERE Objects.Id = 1

Благодаря другому ответу , который указал мне на предложение OUTPUT, я могу продемонстрировать решение:

-- now I want to copy the data from from object 1 to object 2 without looping
INSERT INTO @Data_Table (Data)
OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId)
SELECT Data.Data
FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId
                INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id 
WHERE Objects.Id = 1

Оказывается, однако, что это не так просто в реальной жизни из-за следующей ошибки

, предложение OUTPUT INTO не может быть по обе стороны от ( первичный ключ, внешний ключ)

Я все еще могу OUTPUT INTO создать таблицу temp, а затем закончить с обычной вставкой. Поэтому я могу избежать цикла, но я не могу избежать таблицы temp.

16
ответ дан 3 revs 20 August 2018 в 23:01
поделиться
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE InsetIntoTwoTable

(
@name nvarchar(50),
@Email nvarchar(50)
)

AS
BEGIN

    SET NOCOUNT ON;


    insert into dbo.info(name) values (@name)
    insert into dbo.login(Email) values (@Email)
END
GO
-1
ответ дан 2 revs, 2 users 67% 20 August 2018 в 23:01
поделиться

// если вы хотите вставить то же самое, что и первая таблица

$qry = "INSERT INTO table (one, two, three) VALUES('$one','$two','$three')";

$result = @mysql_query($qry);

$qry2 = "INSERT INTO table2 (one,two, three) VVALUES('$one','$two','$three')";

$result = @mysql_query($qry2);

// или если вы хотите вставить определенные части таблицы one

 $qry = "INSERT INTO table (one, two, three) VALUES('$one','$two','$three')";


  $result = @mysql_query($qry);

 $qry2 = "INSERT INTO table2 (two) VALUES('$two')";

 $result = @mysql_query($qry2);

// Я знаю, что он выглядит слишком хорошо, чтобы быть прав, но он работает, и вы можете продолжать добавлять запрос просто изменить

    "$qry"-number and number in @mysql_query($qry"")

У меня есть 17 таблиц, в которых он работал.

-2
ответ дан 3 revs, 2 users 84% 20 August 2018 в 23:01
поделиться
  • 1
    если что-то пойдет не так в середине вставок? Ваши вставки будут неполными. правильно? Если вы это сделаете, у вас есть функция отката для лечения? Если нет, у вас возникла проблема с целостностью данных. – B4NZ41 23 July 2012 в 20:49
  • 2
    -1. Этот ответ, похоже, использует методы MySQL в PHP. Вопрос помечен тегом sql и sql-server без упоминания MySQL или PHP. – mskfisher 2 January 2014 в 23:56

Похоже, что таблица Link отражает многие: многие отношения между таблицей Object и таблицей данных.

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

Это позволяет всей вашей логике оставаться инкапсулированной в один простой вызов sproc.

4
ответ дан Bob Probst 20 August 2018 в 23:01
поделиться
  • 1
    Почему никто не поддержал вас? Хранимая процедура является очевидным и лучшим способом. Объедините свой ответ с ответом Джоэля Коэхорна, и вы получите лучший ответ! – Rhyous 6 December 2014 в 22:57

Вам все еще нужны два оператора INSERT, но похоже, что вы хотите получить IDENTITY из первой вставки и использовать его во втором, и в этом случае вы можете посмотреть OUTPUT или OUTPUT INTO: http://msdn.microsoft.com/en-us/library/ms177564.aspx

28
ответ дан Cade Roux 20 August 2018 в 23:01
поделиться
  • 1
    Благодаря! Я не знал о ключевом слове OUTPUT, именно то, что я искал. +1 – Rex Morgan 14 September 2010 в 21:52

Вставка может работать только по одной таблице за раз. Несколько вложений должны иметь несколько операторов.

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

Кстати, я предполагаю, что вы хотите скопировать данные из Object_Table; в противном случае вопрос не имеет смысла.

2
ответ дан Carlton Jenke 20 August 2018 в 23:01
поделиться

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

4
ответ дан Craig 20 August 2018 в 23:01
поделиться
  • 1
    Действия являются атомарными, если они завернуты в транзакцию, а не «более или менее». атомное. То, что не обязательно гарантируется, - это уровень изоляции, если вы не указали это. – Dave Markle 28 November 2011 в 23:00

Прежде чем иметь возможность делать многопользовательскую вставку в Oracle, вы можете использовать трюк, включающий вставку, в представление, в котором на нем был установлен триггер INSTEAD OF для выполнения вставок. Это можно сделать в SQL Server?

2
ответ дан David Aldridge 20 August 2018 в 23:01
поделиться

Вы можете создать представление, в котором будут указаны имена столбцов, требуемые инструкцией вставки, добавить триггер INSTEAD OF INSERT и вставить в это представление.

4
ответ дан devio 20 August 2018 в 23:01
поделиться

В одном операторе : Нет.

В одной транзакции : Да

BEGIN TRANSACTION
   DECLARE @DataID int;
   INSERT INTO DataTable (Column1 ...) VALUES (....);
   SELECT @DataID = scope_identity();
   INSERT INTO LinkTable VALUES (@ObjectID, @DataID);
COMMIT

Хорошей новостью является то, что вышеуказанный код также гарантирован atomic и может быть отправлен на сервер из клиентского приложения с одной строкой sql в одном вызове функции, как если бы это был один оператор. Вы также можете применить триггер к одной таблице, чтобы получить эффект от одной вставки. Тем не менее, это, в конечном счете, еще два утверждения, и вы, вероятно, не хотите запускать триггер для каждой вставки .

182
ответ дан Joel Coehoorn 20 August 2018 в 23:01
поделиться
  • 1
    Это то, что я ищу долгое время. Благодаря :) – nandu.com 14 April 2011 в 18:24
  • 2
    Почему это было просто опущено? – Joel Coehoorn 29 April 2011 в 22:31
  • 3
    @Joel, отличный вопрос. Предположительно, кто-то пожелал альтернативной реальности, и вы были носителем плохих новостей. ;) – Kirk Woll 10 September 2011 в 04:07
  • 4
    это спасло мой день сегодня :) thanx – Shekhar_Pro 12 November 2011 в 09:55
  • 5
    Это не решает проблему. Он хочет вставить данные, прочитанные из Object_Table. То есть a insert into ... select .... Как этот код считывается или циклически проходит через данные Object_Table. Вам все еще нужно использовать переменную таблицы, которую не хотел бы делать айзер. – hofnarwillie 25 April 2013 в 16:25

Я хочу подчеркнуть использование

SET XACT_ABORT ON;

для транзакции MSSQL с несколькими операторами sql.

См.: https://msdn.microsoft.com/ en / us / library / ms188792.aspx Они дают очень хороший пример.

Итак, окончательный код должен выглядеть следующим образом:

SET XACT_ABORT ON;

BEGIN TRANSACTION
   DECLARE @DataID int;
   INSERT INTO DataTable (Column1 ...) VALUES (....);
   SELECT @DataID = scope_identity();
   INSERT INTO LinkTable VALUES (@ObjectID, @DataID);
COMMIT
2
ответ дан Sergei Zinovyev 20 August 2018 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: