Tengo una tabla en la que necesito tanto de los valores primarios porque estoy referencia a esta combinación como clave externa en las otras tablas. Definición de la tabla y los datos que tengo que poner es la siguiente

create table T1
(
  sno number(10),
  desc varchar2(10),
  constraint T1_PK primary key(sno,desc)
)
DATA to put
sno    | desc
---------------------------
100    | "hundred"
000    | null
120    | "one twenty"
123    | ""   <EMPTY STRING>
000    | ""   <EMPTY STRING>

Problema aquí es desc pueden a veces ser null. Clave principal no puede ser null así que cuando me encuentro con un valor null – estoy insertando simplemente «a» en la tabla. El problema aquí es algunas veces desc puede tener una cadena vacía.
Si puedo insertar los datos sobre 100,Nulo y 100,»» son dos cosas diferentes, pero no soy capaz de ponerlos en la mesa. No quiero poner algunos cadena como ‘VACÍO’ si es null porque puede confundir al usuario final que se busca en la tabla.

1) ¿Cómo puedo manejar el nulo caso para los desc, a pesar de tener como clave principal. No puedo utilizar el Auto número de secuencia.
2) ¿Cómo puedo distinguir entre la cadena nula introducido por mí y uno que ya está ahí?

  • ¿Por qué no utilizar VACÍA en lugar de null en el registro y uso NULLIF(‘VACÍO’, desc) función para devolver el resultado al usuario final?
  • gracias IGOR, esta parece ser una buena idea .. gracias de nuevo
InformationsquelleAutor Ram | 2010-03-11

4 Comentarios

  1. 8

    ¿Por qué no introducir un verdadero atributo de clave principal (como id) que se auto incrementa, y crear un índice sobre sno y desc?

    • Un índice ÚNICO o restricción sobre sno y desc.
    • Un índice normal para agilizar las búsquedas y una restricción de unicidad, que trata a null y cadenas vacías, ya que un índice único no sería posible. Usted puede crear un procedimiento almacenado que se encargará de la inserción de los datos de manera uniquness está garantizado.
  2. 6

    Oracle trata vacío VARCHAR campos como sinónimo de NULL, que es un poco controversial, pero es algo que tienes que vivir. Así que usted no puede poner una cadena vacía en una clave principal, porque no se puede poner un NULL en una clave principal.

    Mi consejo? El uso de una técnica de clave principal de decir un número (auto-incrementado en MySQL/SQL Server, desde un SEQUENCE en Oracle). Poner en un índice único en la pareja de los otros campos. Así:

    CREATE TABLE t1 (
      id NUMBER(10) PRIMARY KEY,
      sno NUMBER(10),
      desc VARCHAR2(10)
    );
    CREATE SEQUENCE t1_seq;
  3. 4

    desc no debe nunca estar en la clave principal. Simplemente, no tiene necesidad de ello. Leer sobre lo que es una clave primaria es, en la base de datos relacional de la teoría.

    Que dijo, lo que quieres no es posible – por la teoría relacional, las claves primarias no están permitidos t ocontain «undefined» valores», como tienen que ser único – esto es parte de la trinarias lógica SQL despliega.

    Alguien que REALMENTE hizo un mal trabajo en su diseño de base de datos. El disparo de malo.

  4. 0

    Usar un CHAR en vez de tipo VARCHAR. Vacío estará en blanco. Sería necesario establecer un espacio en blanco en lugar de cadena vacía para evitar Oracle para convertir la cadena vacía en NULL. Tenga en cuenta que en un campo CHAR un espacio en blanco es el mismo como dos espacios en blanco, tres espacios en blanco… (pero es diferente a cero de espacios en blanco para Oracle).

Dejar respuesta

Please enter your comment!
Please enter your name here