2014-05-11 5 views
0

안녕하세요, Countires, States, Cities의 HTML 드롭 다운이있는 간단한 양식을 개발 중입니다. 국가, 주, 도시를 추가하고 업데이트하면 문제가 없습니다. 모든 것이 완벽하게 작동합니다. 그리고 문제는 삭제할 때 여기에옵니다 (비활성화라고합시다).국가 별 SqL 디자인 - 국가 - 도시

저는 인터넷에서 일부 사이트를 참조하여 국가, 주, 도시 드롭 다운 유형에 이상적인 표를 디자인했습니다. 마찬가지로 :

Countries Table: 

    |SerialNo|CountryName|CountryId|Active| 

States Table 
    |SerialNo|StateName|StateId|CountryId|Active| 


CitiesTable: 
    |SerialNo|CityName|CityId|StateId|IsActive| 

그래서 어떤 나라를 비활성화시 전, "거짓"= 활성 이렇게 비활성화 된 나라 내 그리드에 표시하지 않을 만들고있다. 이와 같은 경우 각국이 보유하고있는 국가는 또한 권리를 잃게됩니다. SQL 쿼리 :

그래서 나는이 같은 한 두 tables.But에서

내가 나라 비활성화 할 수있는 두 테이블에 CountryId 것처럼
Update CountriesTable set Active='false' where CountryId= @CountryId 
Update StatesTable set Active='false' where CountryId= @CountryId 

, 미국은 어떻게 비활성화 국가의 도시를 비활성화 할 수 ?? 특정 테이블에서 데이터를 조작 한 후에 다른 테이블을 업데이트하는 Triggers in Sql이라는 개념이 있습니다. 트리거를 사용하여 요구 사항을 충족시킬 수 있습니까? 아니면이를 수행하기위한 좋은 방법이 있습니까?

어떻게해야합니까?

citiestable에 CountryId 열을 하나 더 추가하고 싶지 않습니다. 죄송합니다. 나는 당신 모두에게 분명하다! 모든 참조, 모든 SQL 쿼리, 어떤 도움을 많이 주셔서 감사합니다!

+0

모든 국가에 주정부가있는 것은 아닙니다 (또는 적어도 국가와 도시 간의 영토 구분이 항상 주라고 부름되는 것은 아님). 어떤 DBMS를 사용하고 있는지 표시해야합니다 (비록 내가 MS SQL Server인지, 어느 버전이 중요한지, 특히 옛날 식인 경우). 그리고 예, 국가의 상태를 업데이트하여 주 및 도시로 전파하려면 트리거를 사용하십시오.그러나 트리거는 IsActive = 'true'로 설정해야합니다. 당신이 그렇게한다면 방아쇠가 거짓을 설정하는 것을 원하지 않을 것입니다. –

+0

엔티티에 대한 ISO 정보 (존재하는 경우) (예 : [국가 코드] (http://en.wikipedia.org/wiki/ISO_3166-1))를 포함하려고합니다. 주 (국가 세분) 및 도시에 대한 동일한 정보가있을 수 있습니다. –

답변

0

이 특정 국가의 ID에 대한 Cities 테이블에 올바른 행의 IsActive 열을 설정하는 기본 UPDATE 진술 필터링합니다.

UPDATE Cities 
    SET IsActive = 'false' 
WHERE StateID IN (SELECT StateID FROM States WHERE CountryID = @CountryID); 

거의 모든 SQL DBMS에서 작동합니다. 다른 방식으로 작성할 수있는 조인 표기법을 사용하는 다른 표기법이있을 수 있습니다.

DBMS의 관련 구문을 사용하여 DBMS의 트리거에이를 통합해야합니다. 어떤 DBMS를 식별하지 못했기 때문에 확실하지는 않습니다. (필자가 지적했듯이, MS SQL Server가있을 확률은 매우 높습니다.)

또는 false로 국가의 IsActive 상태를 설정하는 것은 국가에서 국가 또는 도시가 표시되지 않도록 충분한 있도록 스키마 및 쿼리를 재 설계 할 수 있습니다 - 그의 answerMitch Wheat 옹호한다.

트리거는 국가가 다시 활성화되는 것을 고려해야합니다. 'false'을 사용하는 것이 항상 적절한 것은 아닙니다.

+0

그것은 그렇게 단순 해 보인다 ... thanxxx !!! – user3452210

1

트리거가 필요하지 않습니다. States을 선택할 때, Countries에 가입하고 나라 IsActive

SELECT * 
FROM Countries 
WHERE IsActive <> False; 

SELECT s.* 
FROM States s 
INNER JOIN Countries c on c.CountryId = s.CountryId 
WHERE c.IsActive <> False;