Как исправить ограничение внешнего ключа при попытке ссылки на два первичных ключа из одной таблицы?

Синтаксис:

  class Sample
  {
     public:
         int Sam_x;
         int Sam_y;

     Sample(): Sam_x(1), Sam_y(2)     /* Classname: Initialization List */
     {
           // Constructor body
     }
  };

Необходимость списка инициализации:

 class Sample
 {
     public:
         int Sam_x;
         int Sam_y;

     Sample()     */* Object and variables are created - i.e.:declaration of variables */*
     { // Constructor body starts 

         Sam_x = 1;      */* Defining a value to the variable */* 
         Sam_y = 2;

     } // Constructor body ends
  };

в вышеуказанной программе. Когда выполняется конструктор класса, создаются Sam_x и Sam_y. Затем в корпусе конструктора определены эти переменные данных элемента.

Варианты использования:

  1. Константные и ссылочные переменные в классе

В C переменные должны быть определены во время создания. то же самое в C ++, мы должны инициализировать переменную Const и Reference во время создания объекта, используя список инициализации. если мы выполним инициализацию после создания объекта (внутри тела конструктора), мы получим ошибку времени компиляции.

  1. Объекты-члены класса Sample1 (базовый), которые не имеют конструктора по умолчанию
     class Sample1 
     {
         int i;
         public:
         Sample1 (int temp)
         {
            i = temp;
         }
     };
    
      // Class Sample2 contains object of Sample1 
     class Sample2
     {
      Sample1  a;
      public:
      Sample2 (int x): a(x)      /* Initializer list must be used */
      {
    
      }
     };
    

При создании объекта для производного класса, который внутренне вызывает конструктор производных классов и вызывает конструктор базового класса (по умолчанию). если базовый класс не имеет конструктора по умолчанию, пользователь получит ошибку времени компиляции. Чтобы избежать этого, у нас должно быть либо

 1. Default constructor of Sample1 class
 2. Initialization list in Sample2 class which will call the parametric constructor of Sample1 class (as per above program)
  1. Имя параметра конструктора класса, и элемент данных класса одинаковы:
     class Sample3 {
        int i;         /* Member variable name : i */  
        public:
        Sample3 (int i)    /* Local variable name : i */ 
        {
            i = i;
            print(i);   /* Local variable: Prints the correct value which we passed in constructor */
        }
        int getI() const 
        { 
             print(i);    /*global variable: Garbage value is assigned to i. the expected value should be which we passed in constructor*/
             return i; 
        }
     };
    

Как и все мы знаете, локальная переменная имеет самый высокий приоритет, чем глобальная переменная, если обе переменные имеют одинаковое имя. В этом случае программа учитывает значение «i» {как левую, так и правую переменную. i.e: i = i} как локальная переменная в конструкторе Sample3 (), а переменная-член класса (i) переопределена. Чтобы избежать этого, мы должны использовать либо

  1. Initialization list 
  2. this operator.
0
задан Twendle 28 March 2019 в 03:18
поделиться

2 ответа

Для этого нужно создать один внешний ключ, например:

CREATE TABLE IF NOT EXISTS TestBridge2
(
TestBridgeID integer Primary key,
WorkOrder varchar(15),      
Date datetime,                  

Foreign key (WorkOrder, Date) references TestInformation2 (WorkOrder, Date)
) ENGINE = InnoDB;
0
ответ дан devesh-ahuja 28 March 2019 в 03:18
поделиться

Это должен быть один составной внешний ключ, а не два:

CREATE TABLE `TestBridge2` (
    `TestBridgeID` INTEGER NOT NULL,
    `WorkOrder` VARCHAR(15),
    `Date` DATETIME,
    PRIMARY KEY (`TestBridgeID`),
    CONSTRAINT FOREIGN KEY (`WorkOrder`, `Date`) REFERENCES `TestInformation2` (`WorkOrder`, `Date`)
)
ENGINE=InnoDB;

0
ответ дан fifonik 28 March 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: