복붙노트

[SQL] 하나의 ID 열이있는 테이블에 행을 삽입 만

SQL

하나의 ID 열이있는 테이블에 행을 삽입 만

나는 차 키 하나만 열, adminId와 테이블 관리자가 있습니다. 때문에 비즈니스 규칙은이 방법이 있습니다.

나는 한 번 이해하고 싶은 모두를 위해이 같은 테이블에 삽입 값이 저장 프로 시저를 작성하는 방법에 대해 설명합니다. 나는 SQL Server 및 T-SQL을 사용 SCOPE_IDENTITY를 사용하여 시도 ()하지만 테이블이 허위 또는 해제에 INSERT_IDENTITY이 있기 때문에 그 일을하지 않는입니다.

난 정말 더미 값을 삽입하지에 같은 단지에 새 행을 삽입 할 수있을 것입니다. 감사!

해결법

  1. ==============================

    1.당신이 IDENTITY 하나 열이있는 경우, 다만 이렇게

    당신이 IDENTITY 하나 열이있는 경우, 다만 이렇게

    INSERT MyTable DEFAULT VALUES;  --allows no column list. The default will be the IDENTITY
    SELECT SCOPE_IDENTITY();
    

    당신이 정체성이없는 경우에, 당신은 그것을 설정할 수 있습니까? 이것은 최선의 방법입니다 .. 위의 SQL을 사용합니다.

    그렇지 않은 경우 새 행을 삽입 할

    INSERT MyTable (admidid)
    OUTPUT INSERTED.admidid --returns result to caller
    SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable
    

    노트:

  2. ==============================

    2.당신은 당신의 선택 문에 IDENTITY_INSERT를 추가해야합니다 :

    당신은 당신의 선택 문에 IDENTITY_INSERT를 추가해야합니다 :

    SET IDENTITY_INSERT MyTable ON
    
    INSERT INTO MyTable
    (AdminCol)
    
    SELECT AdminColValue
    
     FROM Tableb
    

    작업이 완료되면, 당신이로 기억하게

    SET IDENTITY_INSERT MyTable OFF
    

    여기가 BOL에서 작동하는 방법의 좋은 설명입니다 : http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

  3. ==============================

    3.@Phil : 음주 당신이 당신의 표는 두 (2) 열은 autoincrementing의 PK 컬럼과 여기서 adminName 열이 의미하는 것은? 그것은 단지 여기서 adminName가는 하나의 열이있는 경우 여기서 adminName은 PK 그리고 당신은 물론, 문자열을 자동 증가 수 없습니다. 규칙은 당신이 완전한 Windows가 기본 키를 username을 할 것으로 예상되는 사업을합니까? 다음은 여기서 adminName 컬럼의 대체 고유 인덱스를 필요로하지 않기 때문에 즉, 생존과 메이크업 의미 일 것이다.

    @Phil : 음주 당신이 당신의 표는 두 (2) 열은 autoincrementing의 PK 컬럼과 여기서 adminName 열이 의미하는 것은? 그것은 단지 여기서 adminName가는 하나의 열이있는 경우 여기서 adminName은 PK 그리고 당신은 물론, 문자열을 자동 증가 수 없습니다. 규칙은 당신이 완전한 Windows가 기본 키를 username을 할 것으로 예상되는 사업을합니까? 다음은 여기서 adminName 컬럼의 대체 고유 인덱스를 필요로하지 않기 때문에 즉, 생존과 메이크업 의미 일 것이다.

    그러나 테이블은 두 개의 열이 아닌 하나가있는 경우 :

    자동 증가의 SQLServer에서 테이블 / 열 정의의 일부분이다. 당신은 정수로 열을 정의하고 또한 그것에게 할 ID 열, 일반적으로 1 증분을 지정하지만 수 2, 5, 10 또는 무엇 이건. 행을 삽입하려면 단순히 다른 컬럼 (들) 값 (들)과 PK 열이 아무것도하지 않고 삽입 :

    insert into T
    (foo)   -- column(s) list
    values('bar') -- values list
    

    삽입을 않는 저장된 프로 시저 반환 값 SCOPE_IDENTITY을 만들 수 있습니다 또는 SCOPE_IDENTITY는 OUT 매개 변수로 클라이언트로 전달 될 수 있습니다.

    추신 SCOPE_IDENTITY ()는 현재 범위에서 가장 최근에 생성 된 autoincremented ID 값을 반환 그것은 다음 ID 값을 생성하지 않습니다.

    편집하다:

    아마, 당신의 관리자 테이블 관리자의 집합이 포함되어 있습니다. 이 정수 기본 키 컬럼에 비해 전혀 다른에 열이없는 경우 단, administators을 식별 할 수있는 방법은 없습니다; 당신이 할 수있는 유일한 방법은 서로 구별됩니다. 그건 아주 멀리 전혀 당신을 얻을하지 않습니다. 하지만 당신의 관리자 표 중 다음과 같은 구조를 가지고있는 경우 :

    ID   INTEGER PRIMARY KEY AUTOINCREMENT
    windowsusername   varchar(50)  (unique index)
    

    또는

    windowsusername varchar(50) primary key
    

    다른 테이블에서 관리자의 테이블을 참조 할 수있을 것이며, 외부 키는 의미가있을 것입니다. 그리고 그 하나의 정수 컬럼으로 구성된 테이블이 부족 정확히 무엇이다 - 의미.

    두 개의 열을 갖는, 그런 다음 저장 프로 시저가이 작업을 수행 할 수 :

    insert into Administrators
    (windowsusername)
    values('mydomain\someusername');
    return SCOPE_IDENTITY();
    

    당신의 클라이언트 프로그램은 반환 값으로 자동 생성 및 새로 삽입 된 행에 할당되었던 autoincremented ID를 다시 얻을 것입니다. 이 방법은 일반적인 관행이며, 나는 그것이 "모범 사례"로 간주되는 것을 말하도록 멀리 갈 것입니다.

    추신 당신은 당신이 "삽입 할 아무것도하지 않았다"만일 "값을 삽입"하는 방법을 알고하지 않았다 언급. 이 모순이있다. 당신은 삽입 할 아무것도, 왜입니까? 당신이 고객 대해 아무것도 모르는 경우 왜, 말, 새로운 고객 레코드를 만들 것인가? 아니 자신의 이름, 자신의 도시, 전화 번호, 아무것도?

  4. from https://stackoverflow.com/questions/4117676/inserting-rows-into-a-table-with-one-identity-column-only by cc-by-sa and MIT license