AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77221190
Accepted
ashish.g
ashish.g
Asked: 2023-10-03 17:46:42 +0800 CST2023-10-03 17:46:42 +0800 CST 2023-10-03 17:46:42 +0800 CST

Como criar uma chave composta com todas as colunas anuláveis, exceto nas colunas?

  • 772

Eu tenho uma entidade que não possui nenhuma chave primária natural. Uma linha única é identificada por três colunas, qualquer uma das quais pode ter um valor único e as outras colunas serão nulas.

Para fins de exemplo imaginário, aqui está minha entidade:

--------
Product
--------
Shelf
Order
Customer
Category
--------

Apenas uma coluna de Prateleira ou Ordem de Cliente ou Categoria terá um valor preenchido, provavelmente com um ID (não será um FK de outra tabela).

Como faço para projetar uma mesa para isso? Preciso estritamente identificar linhas exclusivas somente nessas colunas. Estou usando o Oracle DB se isso ajudar.

sql
  • 2 2 respostas
  • 39 Views

2 respostas

  • Voted
  1. Best Answer
    Littlefoot
    2023-10-03T18:14:11+08:002023-10-03T18:14:11+08:00

    Você provavelmente não pode.

    Uma linha única é identificada por três colunas, qualquer uma das quais pode ter um valor único e as outras colunas serão null .

    Isso é um empecilho . Embora você PODE criar uma chave composta exclusiva nessas 4 colunas, tudo ficará bem até que você tente inserir outra linha que já contenha essa combinação.

    Por exemplo:

    SQL> create table product
      2    (shelf     number,
      3     c_order   number,
      4     customer  number,
      5     category  number,
      6     --
      7     constraint uk_product unique (shelf, c_order, customer, category)
      8    );
    
    Table created.
    
    SQL> insert into product (shelf, c_order, customer, category) values (1, null, null, null);
    
    1 row created.
    
    SQL> insert into product (shelf, c_order, customer, category) values (2, null, 8, null);
    
    1 row created.
    
    SQL> insert into product (shelf, c_order, customer, category) values (1, null, 4, null);
    
    1 row created.
    
    SQL> insert into product (shelf, c_order, customer, category) values (1, null, null, null);
    insert into product (shelf, c_order, customer, category) values (1, null, null, null)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SCOTT.UK_PRODUCT) violated
    

    Esta linha falhou porque essa combinação já existe (foi a primeira linha que inseri).

    Se estiver tudo bem para você - quero dizer, você realmente espera que algo assim aconteça - então funcionará. Se não, não vai.

    • 1
  2. Paul W
    2023-10-03T19:25:50+08:002023-10-03T19:25:50+08:00

    Você pode fazer isso criando uma restrição exclusiva (não uma chave primária). Restrições exclusivas permitem que seus membros de coluna sejam capazes de NULL, tratando NULL como um valor distinto. Isso é útil principalmente quando a coluna anulável é algum tipo de indicador de estado/moeda (por exemplo, um NULL end_datepode significar uma linha atualmente ativa em uma tabela histórica do tipo 2, e a restrição impõe que nenhuma entidade tenha mais de um NULL end_date, ou seja , mais de uma linha ativa/atual). Se você quisesse criar uma restrição, você diria:

    constraint uq_product unique ("Shelf","Order","Customer","Category")
    

    No entanto, a sua situação particular não se presta a isso. Honestamente, não consigo imaginar por que você teria um design em que prateleira , pedido , cliente e categoria seriam todos anuláveis, nem por que você teria um valor de identificação em apenas um deles, nem por que a coluna com um valor de identificação mudaria em volta. Nenhuma delas, exceto talvez order , soa como uma coluna de identificação, nem a combinação delas. Não faz sentido que apenas um deles tenha valor e os outros não. Esta é uma falha de design definitiva que deve ser corrigida redesenhando sua(s) tabela(s).

    Corrija seu design para que você tenha uma chave de identificação adequada ou simplesmente não tente criar qualquer tipo de chave. As tabelas não precisam ter restrições. Mas eu suspeito que você provavelmente deveria consertar o design para que você faça isso.

    • 1

relate perguntas

  • Atualizando todas as linhas, exceto uma que tenha os mesmos valores em determinadas colunas

  • Existe uma maneira de inverter apenas os números quando eu retornar uma coluna sql? (hebraico)

  • SQL menor/maior comparação entre booleanos produz resultados inesperados

  • Como atualizar valores na tabela Postgres com base em uma correspondência em uma matriz

  • Como somar colunas no sql server

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve