2009-07-07 3 views
6

편집 : "SQL Server"라고하면 관리 Studio에 대해 실제로 말합니다. 혼란스러워서 미안해.SSMS는 테이블에 중복 레코드를 허용하지만 후속 업데이트는 허용하지 않습니다.

오 이런 일이 발생하면 싫어. 저는 어제 SQL Server를 사용하여 PIVOT 명령을 사용하여 작동 방식을 파악하려고했습니다. 그래서 네 개의 열이있는 새로운 테이블을 만들었고 첫 번째 열은 처음 몇 개의 행에 대해 동일한 값을 갖게되었습니다.

첫 번째 행, 첫 번째 열에 "value1"을 추가하고 Enter 키를 누르십시오. 사인이 없습니다. 키 또는 제약 조건이 추가되지 않았습니다. 첫 번째 행의 다른 열에 대해 NULL을 사용하여 다음 행까지 입력 할 수있었습니다 행 (괜찮습니다). 놀랍게도, 두 번째 행에 "value1"을 입력하고 입력 할 수있게되었습니다. 두 개의 동일한 행이 있기 때문에 불가능합니다. 그러나, 내가 주변에서 어지럽 혔던 이래로, 이것은 나를 괴롭히지 않았다. 이것이 내가가 만든 단지 테이블이기 때문에

표 1

Col1  Col2  Col3  Col4 
--------------------------------- 
Value1  NULL  NULL  NULL 
Value1  NULL  NULL  NULL 
Value1  NULL  NULL  NULL 
Value1  NULL  NULL  NULL 

물론이 이상하고 관계형 이론을 나누기,하지만 난 정말 관심이 없었어요 : 그래서 같은 네 개의 행을 만들 진행 주위를 어지럽히십시오. 그러나, 나는 단지 다음에 일어난 일에서 내 머리카락을 꺼냈다. 이 데이터가 들어 오면 무엇이든 테이블에 없습니다. 행에서 col2, col3 또는 col4를 채우려 고 시도하면 SQL Server에서 중복 행이 있다는 메시지가 나타납니다. "행이 업데이트되지 않았습니다. 행 1의 데이터가 커밋되지 않았습니다. 행 값 (s)를 업데이트하거나 삭제하면 행이 고유하지 않거나 여러 행 (4 행)이 변경됩니다.

다른 말로하면 SQL Server에서 중복 행을 입력 할 수는 있지만 행을 고유하게 만들기 위해 업데이트 할 때 중복 행이 원인이라고 언급하면서 나를 허용하지 않습니다. 최악의 부분은 어떤 행을 삭제할 수도 없기 때문입니다 (동일한 오류 메시지가 나타남). 이 시나리오에서 한 번 발견 한 유일한 해결책은 테이블을 삭제하고 다시 시작하는 것입니다. 이는 어리석은 일입니다.

내 질문은 어떻게 이런 종류의 동작이 10 년 이상 발전된 잘 알려진 프로그램에 존재할 수 있는가입니다. 내가 머리가 빠지고 SQL Server의 동작을 받아 들여야합니까? 나에게 이것은 받아 들일 수없는 것이고 SQL Server는 처음에는 중복 행을 입력 할 수 없도록하거나, 모두 고유 할 때까지 중복 행을 업데이트하고 저장하려고 시도해야합니다.

이것은 어떤 종류의 SQL Server 싫어하는 게시판을위한 것이 아닙니다. 비교적 드물게 나는 이런 행동을하지만, 할 때, 정말 나를 뒤에서 나를 미칠 수 있습니다. 나는 왜 프로그램이 이런 식으로 구축 된 행동을하는지 이해하지 못한다. 세계에서 왜 내가 그것을 고칠 계획이 없다면 처음부터 중복 행을 입력 할 수 있었던 것처럼?

나는 MS Access에서 다시 일하는 것을 기억하고 있으며, 나는 이상한 고풍 행동과 같은 종류의 일을합니다. 몇 번씩 나는 거대한 양의 데이터를 복사하고, 테이블을 다시 만들고, 복사해서 다시 복사해야했습니다. 왜냐하면 Access에서 가지면 안되는 작업을 수행 할 수 있었기 때문입니다. 이제는 수정하지 말아야합니다. - 효과적으로 교착 상태가 발생합니다.

그래서 여기서 어떻게됩니까? SQL Server에 접근 할 때 일종의 패러다임 변화가 필요합니까? 나 또는 SQL Server가 그 문제입니까? (당신이 나 일 수 있다고 말하면 받아 들일 수 있습니다.)

답변

9

모든 관리 스튜디오는 당신을 위해 SQL을 생성하고 DB에 대해 실행하는 UI를 제공합니다.

경우에 따라 행을 추가 할 때마다 INSERT 문이 생성됩니다. 이것은 완벽하게 유효합니다.

그런 다음 UI를 사용하여 이러한 모든 중복 레코드 중에서 하나의 레코드를 삭제하거나 업데이트하려고 시도했을 때 SQL을 생성 할 수 없었습니다. 테이블에 키가 없으므로 UPDATE 또는 DELETE하려는 레코드를 나타내는 WHERE 절을 생성 할 수 없습니다.

"오류"메시지가 분명하고 나에게 잘 들립니다. 귀하의 의견에 관해서는

:

놀랍게도, 그것은 또한 두 번째 행의 "값 1"을 입력하고 아래 입력 에 저를 허용 -이 불가능 해야 지금이 있기 때문에 두 개의 동일한 행. 그러나, 내가 단지 주위에 어지럽히 기 때문에, 이것은 나를 괴롭히지 않았다.

는 분명히 이것은 이상하고 관계 이론을 파괴하지만,이 내가 주변에 엉망으로 만든 단지 테이블이기 때문에 난 정말 치료를하지 않았다.

중복을 허용하는 데이터베이스 테이블을 갖는 데는 아무런 문제가 없습니다. 필요한 경우 완벽하게 유효한 방법입니다. 당신이 중복을 허용했다는 것을 "돌보는"또는 "귀찮게"하지 않는 것에 관해서. 그것은 실수가있는 곳입니다. 그러면 기본 키를 추가하는 것을 잊었다는 것을 깨달았어야합니다.

+0

실제로 삽입을 허용하지만 업데이트/삭제를 허용하지 않는 이유를 설명해 주셔서 감사합니다. 이것은 매우 도움이되었습니다. – JoeCool

+1

아, 이제 오류 메시지가 훨씬 잘 이해됩니다. 처음에는 SSMS가 일종의 "깨어나 기"였고 행을 지우면 세 개의 중복 된 행이 여전히 존재한다는 것을 알았 기 때문에 오류가 중복 행의 잠재 실현이라고 생각했습니다. 중복을 허용하십시오. 하지만 삭제할 행이 무엇인지 모르기 때문에 행을 삭제할 수 없습니다. – JoeCool

1

SQL Server Management Studio의 레코드 편집기는 SQL Server 제품 오퍼링의 소규모 (상대적으로 중요하지 않은 부분)입니다.나는 당신이 서버 자체의 상대적인 품질에 대해 걱정하지 않고 에디터의 단점을 안전하게 받아 들일 수 있다고 생각한다.

Management Studio에서는 사용자가 직접 SQL을 입력 한 것처럼 SQL 문을 실행하여 작업을 수행합니다. 그래서 규칙을 어기면 벌금을 내야합니다.

+0

그래, 그게 내 문제라고 생각해. 나는 실제 서버와 밀접하게 결합 된 내 머리 속에 떠오르는 SSMS를보고 있지만 실제로 데이터베이스에 쓰는 모든 응용 프로그램과 마찬가지로 SQL 문을 보내고받습니다. – JoeCool

1

변덕 스럽지만 결함이 있습니다. 고유 한 키가없는 테이블을 만드는 것이 가장 합당 합니다만, 동일한 행이 있으면 SSMS (또는 그 이전의 Enterprise Manager)의 테이블 편집기로 행을 삭제할 수 없습니다.

중복 행을 만들 수있는 SSMS가 아니기 때문에 기본 키가없는 테이블을 만들 때 허용 한 것입니다. 항상 문제를 해결할 수있는 자동 증가 ID 열을 만들 수 있습니다.

필자는 이런 종류의 테이블 편집기를 사용하지 않으므로 INSERT 문을 스크립팅합니다.

+0

SSMS를 사용하면 중복 행을 입력 할 수는 있지만 삭제할 수없는 경우 이는 필자에게 비할 바가 아닌 것처럼 보입니다. 나는 그것을 허용 할 이유가 없다고 생각한다. 내 의견으로는, 그것은 둘 다 또는 둘 다 허용해야한다. – JoeCool

+3

그러나 조건이없는 mytable에서 삭제하면 레코드가 제거되므로 삭제할 수있는 방법이 아닙니다. SSMS는 일정 수준의 최소 역량을 갖춘 것으로 보입니다. 그것은 반드시 당신을 위해 모든 것을 다 주진 않을 것입니다. 프로그래밍에 오신 것을 환영합니다. –

+2

기본 키를 추가하면 전체 문제가 해결됩니다. –

1

고유 키가없는 경우 삭제할 행을 도구에서 예상하는 방법을 잘 모르겠습니다. 중복 사본 중 하나만 삭제하거나 둘 다 삭제 하시겠습니까? 단지 하나라면, 사용해야 할 열쇠는 무엇입니까?

관리 스튜디오는 도구입니다. 완벽한 테이블 디자인이나 기본 데이터베이스 101을 시행하는 것이 중요합니다.이 데이터베이스는 대다수의 고유 키를 갖는 것을 포함합니다. 중복 행이 필요한 미친 비즈니스 모델을 가지고 있다면 어떨까요? 도구가 중복 된 역할을 막을 수 있다고 불평하지 않겠습니까?

하단 라인은 입니다. 1.도구로 데이터를 편집하거나 삭제해서는 안됩니다. 대부분의 경우 스크립트를 스크립팅해야합니다.
2. 고유 한 키가 있어야합니다.

해당 항목이없는 도구를 비난 할 수는 없습니다.

+1

이전에이 진술을 들었습니다. 항상 모든 것을 스크립팅하고 에디터를 사용해서는 안됩니다. 왜 이런거야? 마조히즘? –

+1

@ 로버트 하비 (Robert Harvey) 저는 이것이 아주 오래된 주석 인 것을 알고 있습니다 만, 스크립트를 사용해야하는 이유는 다음과 같습니다. 먼저 GUI는 스크립트를 사용하는 경우 발생하지 않는 테이블 잠금을 유발하는 가장 비효율적 인 방식으로 작업을 수행합니다. 다음으로 데이터베이스에 대한 모든 변경 사항을 스크립팅하고 소스 제어에 넣어야하므로 dev에서 QA로 이동해야 할 때 다른 환경에서 스크립트를 실행할 수 있습니다. 셋째, GUI가 당신에게 할 수없는 일은 SQL 스크립트를 작성하면 가능하다는 것입니다. – HLGEM

관련 문제