none
Ordenação Chave Primária RRS feed

  • Pergunta

  • Olá, estou tendo um pequeno problema com minha tabela. Algumas vezes quando adiciono uma serie de dados eles são gravados no banco de forma 'desordenada'.
    Ex.: se eu insiro 5 registros (chaves: 0 - 1 - 2 - 3 - 4) pela lógica eles deviam entrar nessa ordem: 

    0

    1

    2

    3

    4

    Mesmo assim, as vezes eles são gravados fora de ordem
    Ex.: 

    0

    2

    1

    4

    3

    Gostaria de entender como isso acontece e se existe alguma forma de não acontecer novamente. Pois preciso usar um XML dessa tabela em outros projetos e essa 'ordem' é de extrema importância.
    Desde já muito obrigado!

    sexta-feira, 27 de março de 2015 11:29

Respostas

  • Deleted
    sexta-feira, 27 de março de 2015 23:00
  • Daniel,

    Isto ocorre porque a PK de sua tabela tem outra coluna como prioridade para a ordenação desta chave.

    Talvez seja necessário recriar a tabela para que esta ordenação esteja de acordo com o que você realmente precisa.

    Veja abaixo um exemplo de como uma coluna adicionada fora de ordem na criação de um índice pode influenciar suas consultas.

    Neste exemplo, eu criei uma coluna CD_CARGO e uma CD_CLIENTE, mas a prioridade de ordenação é da coluna CD_CLIENTE:

    Agora vou criar outra tabela para substituir a atual, com a PK com as colunas na ordem adequada (neste exemplo o CD_CARGO):

    Segue abaixo o script T-SQL deste exemplo:

    CREATE TABLE TB_CARGO (
    	CD_CARGO	int			NOT NULL,
    	CD_CLIENTE	int			NOT NULL,
    	[Descricao]	varchar(90)	NOT NULL,
     CONSTRAINT [PK_Cargo] PRIMARY KEY CLUSTERED (CD_CLIENTE ASC, CD_CARGO ASC)
    ) ON [PRIMARY]
    GO
    
    INSERT INTO TB_CARGO VALUES (1, 2, 'CARGO 1')
    INSERT INTO TB_CARGO VALUES (2, 1, 'CARGO 2')
    INSERT INTO TB_CARGO VALUES (3, 0, 'CARGO 3')
    GO
    
    SELECT * FROM TB_CARGO;
    GO
    
    -----------------------------------------
    
    --CORRIGINDO A ORDENAÇÃO
    CREATE TABLE TB_CARGO_NOVO (
    	CD_CARGO	int			NOT NULL,
    	CD_CLIENTE	int			NOT NULL,
    	[Descricao]	varchar(90)	NOT NULL,
     CONSTRAINT [PK_TB_Cargo] PRIMARY KEY CLUSTERED (CD_CARGO ASC, CD_CLIENTE ASC)
    ) ON [PRIMARY]
    GO
    
    INSERT INTO TB_CARGO_NOVO
    SELECT * FROM TB_CARGO;
    GO
    
    --SUBSTITUINDO A TABELA "ATUAL"
    DROP TABLE TB_CARGO;
    GO
    
    EXEC sp_rename 'TB_CARGO_NOVO', 'TB_CARGO';
    GO
    
    SELECT * FROM TB_CARGO;
    GO


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta Eduardo.Romero segunda-feira, 30 de março de 2015 12:43
    sexta-feira, 27 de março de 2015 14:55
    Moderador

Todas as Respostas

  • Você está usando o auto increment para inserir esses dados na pk?
    sexta-feira, 27 de março de 2015 11:49
  • não, eu que incluo os valores.
    sexta-feira, 27 de março de 2015 11:49
  • Seta a tua PK como auto increment. Isso vai resolver teu problema.
    sexta-feira, 27 de março de 2015 12:02
  • blz, vou testar.

    Muito obrigado.

    sexta-feira, 27 de março de 2015 12:18
  • Daniel,

    Isto ocorre porque a PK de sua tabela tem outra coluna como prioridade para a ordenação desta chave.

    Talvez seja necessário recriar a tabela para que esta ordenação esteja de acordo com o que você realmente precisa.

    Veja abaixo um exemplo de como uma coluna adicionada fora de ordem na criação de um índice pode influenciar suas consultas.

    Neste exemplo, eu criei uma coluna CD_CARGO e uma CD_CLIENTE, mas a prioridade de ordenação é da coluna CD_CLIENTE:

    Agora vou criar outra tabela para substituir a atual, com a PK com as colunas na ordem adequada (neste exemplo o CD_CARGO):

    Segue abaixo o script T-SQL deste exemplo:

    CREATE TABLE TB_CARGO (
    	CD_CARGO	int			NOT NULL,
    	CD_CLIENTE	int			NOT NULL,
    	[Descricao]	varchar(90)	NOT NULL,
     CONSTRAINT [PK_Cargo] PRIMARY KEY CLUSTERED (CD_CLIENTE ASC, CD_CARGO ASC)
    ) ON [PRIMARY]
    GO
    
    INSERT INTO TB_CARGO VALUES (1, 2, 'CARGO 1')
    INSERT INTO TB_CARGO VALUES (2, 1, 'CARGO 2')
    INSERT INTO TB_CARGO VALUES (3, 0, 'CARGO 3')
    GO
    
    SELECT * FROM TB_CARGO;
    GO
    
    -----------------------------------------
    
    --CORRIGINDO A ORDENAÇÃO
    CREATE TABLE TB_CARGO_NOVO (
    	CD_CARGO	int			NOT NULL,
    	CD_CLIENTE	int			NOT NULL,
    	[Descricao]	varchar(90)	NOT NULL,
     CONSTRAINT [PK_TB_Cargo] PRIMARY KEY CLUSTERED (CD_CARGO ASC, CD_CLIENTE ASC)
    ) ON [PRIMARY]
    GO
    
    INSERT INTO TB_CARGO_NOVO
    SELECT * FROM TB_CARGO;
    GO
    
    --SUBSTITUINDO A TABELA "ATUAL"
    DROP TABLE TB_CARGO;
    GO
    
    EXEC sp_rename 'TB_CARGO_NOVO', 'TB_CARGO';
    GO
    
    SELECT * FROM TB_CARGO;
    GO


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta Eduardo.Romero segunda-feira, 30 de março de 2015 12:43
    sexta-feira, 27 de março de 2015 14:55
    Moderador
  • Deleted
    sexta-feira, 27 de março de 2015 23:00