2009-04-26 3 views
3

삽입 구문 내가 사용하고이SQL : INSERT와 UPDATE에 같은 문자열을 사용합니까? 내가 사용하고

INSERT INTO TableName VALUES (...) 

업데이트 구문 내 모든 코드에 따라서

UPDATE TableName SET ColumnName=Value WHERE ... 

입니다, 내가하는 것, 2 문자열을 생성해야 이

insertStr = "(27, 'John Brown', 102)"; 
updateStr = "ID=27, Name='John Brown', ItemID=102"; 

같은 결과 후 별도로

01을 사용

30 개의 열과 같은 테이블로 작업 할 때 문제가 발생하기 시작합니다.

INSERT 및 UPDATE 둘 모두에서 사용할 문자열을 하나만 생성 할 수 있습니까?

예 : INSERT 문에서 UPDATE 문 또는 updateStr에 위의 insertStr을 사용하거나 전혀 새로운 방식입니까?

답변

2

일부 DBMS에는이 작업을 수행 할 수있는 확장 프로그램이 있지만 왜이 기능을 제공하지 않습니까? 우리는 전에 이것을 실제로했습니다. 이 연관 배열이없는 경우, 당신이 그들을 모방 할 수

pk{"ID"} = "27" 
val{"Name"} = "'John Brown'" 
val{"ItemID"} = "102" 
upsert ("MyTable", pk, val) 

과 :

은 당신이 사용하는 어떤 언어 모르겠어요하지만 당신은 뭔가를 썼다 수있는 아마 연관 배열을 가지고 여러 정수 기반 문자열 배열을 사용합니다. 우리 upsert() 기능에

, 우리는 단지합니다 (update이 실패한 경우 update 다음 insert) 캐릭터 라인을 건설하고 우리의 DBMS로 통과시켰다. 업데이트 구문의 작성이 훨씬 쉬워 졌기 때문에 기본 키를 다른 필드와 분리하여 보관했습니다 (기본 키 열은 where 절에 들어가고 다른 열은 방금 설정되었습니다).

위 (우리가 실패 update에 대해 다른 검사를했다하지만이 예에 @@rowcount을 넣었습니다) 다음과 같은 SQL 초래 호출의 결과 : 일을 하나 개의 솔루션입니다

update MyTable set 
    Name = 'John Brown', 
    ItemID = 102 
    where ID = 27 
if @@rowcount=0 
    insert into MyTable (ID, Name, ItemID) values (
     27, 
     'John Brown', 
     102 
    ) 

을 잘 우리를 위해. 의심의 여지가 다른 사람이 있습니다.

7

나는 완전히 새로운 접근이 필요하다고 생각합니다. SQL Injection에 열려 있습니다. 데이터 입력을받는 방법과 데이터베이스에 명령문을 보내는 방법에 대한 샘플 코드를 제공하십시오. alt text http://goose.ycp.edu/~weddins/440/S09%20IFS440%20Bobby%20Drop%20Tables.PNG

+2

. 이것이 프로덕션 코드 인 경우 매개 변수화 된 구문을 최소한 사용해야합니다. 어떤 언어를 사용하고 있는지 알려 주시면 오브젝트 지속성과 같은 더 나은 방법을 찾아 낼 수 있습니다. –

+0

이것은 어떻게 관련이 있습니까? 문제는 두 문장으로 동작하는 문자열을 만드는 것입니다. – womp

+4

더 나은 프로그래밍 실습을 배우는 것이 항상 적절합니다. –

1

일부 데이터베이스는 이와 관련하여 독점적 인 확장 기능을 제공합니다.

INSERT 및 UPDATE의 구문이 좀 더 일관성이있을 수 있다는 것에 동의하지만, 지금은 현실에 불과합니다. 지금은 변경되지 않습니다. 많은 시나리오에서 가장 좋은 방법은 "완전히 새로운 방식"입니다. 개체 관계형 매핑 라이브러리 (또는 .NET DataSets와 같은 약한 차 계층)를 사용하여 차이를 추상화하고 낮은 수준의 SQL에 대해 걱정하지 마세요. 통사론. 물론 모든 응용 프로그램에 대해 실행 가능한 옵션은 아니지만 객체를 작성하거나 업데이트하고 Save 메서드를 호출하고 라이브러리에서 SQL 구문을 파악하도록 할 수 있습니다.

6

필자가 아는 한, ANSI SQL에서 또는 내가 알고있는 어떤 확장 기능에서도 설명 할 수 없습니다. 그러나, 나는 주로 MySQL을 잘 알고 있으며, 아마도 당신이 사용하고있는 RDBMS에 의존 할 것입니다. 예를 들어, MySQL에는 "INSERT ... ON DUPLICATE KEY UPDATE ..."구문이 있습니다.이 구문은 사용자가 게시 한 것과 유사하며 INSERT 쿼리와 UPDATE 쿼리를 결합합니다. 단점은 두 개의 가능한 연산을 단일 쿼리로 결합한다는 것입니다. 그러나 쿼리의 INSERT 및 UPDATE 부분은 분명히 다릅니다.

일반적으로 이러한 종류의 것은 응용 프로그램에서 ORM 계층으로 추상화 될 수 있습니다. 지금까지 원시 SQL이가는 한, 당신이 설명하는 방식으로 작동하는 모든 구문에 관심이 있습니다.

2

글쎄, 진술은 어떨까요? 이 문제를 처리하기 위해 ORM을 살펴볼 수도 있습니다 ...

1

생각해 보면 INSERT와 UPDATE는 완전히 똑같습니다. UPDATE에 필터가있는 것을 제외하고 필드 이름을 값에 매핑합니다. 키가 필드 이름이고 값이 필드에 할당 할 값인 연관 배열을 작성하면 매핑이 생깁니다. INSERT 또는 UPDATE에 따라 적절한 문자열 형식으로 변환하면됩니다. 주어진 매개 변수를 기반으로 변환을 처리하는 함수를 작성하기 만하면됩니다.

1

SQL 서버 2008 :

MERGE dbo.MyTable AS T 
USING 
(SELECT 
    @mykey AS MyKey 
    @myval AS MyVal 
) AS S 

ON (T.MyKey = S.MyKey) 

WHEN MATCHED THEN 
    UPDATE SET 
    T.MyVal = S.MyVal 
WHEN NOT MATCHED THEN 
    INSERT (MyKey, MyVal) 
    VALUES (S.MyKey, S.MyVal) 

MySQL은 : 동의

INSERT (MyKey, MyVal) 
INTO MyTable 
VALUES({$myKey}, {$myVal}) 
ON DUPLICATE KEY UPDATE myVal = {$myVal}