سؤال

لقد قمت بإنشاء بعض الجداول باستخدام Workbench MySQL ، ثم قمت بإعادة توجيه "مهندس الأمام" لإنشاء البرامج النصية لإنشاء هذه الجداول. لكن البرامج النصية تقودني إلى عدد من المشكلات. واحد منها ينطوي على المفاتيح الأجنبية. لذلك حاولت إنشاء إضافات مفاتيح خارجية منفصلة باستخدام جدول ALTER وما زلت أواجه مشاكل. الكود أدناه (عبارات المحددة ، إسقاط/إنشاء عبارات تركتها ... على الرغم من أنني لا أعتقد أنه يجب أن يهم هذا):

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `mydb` ;
 CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;

 -- -----------------------------------------------------
 -- Table `mydb`.`User`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User` (
   `UserName` VARCHAR(35) NOT NULL ,
   `Num_Accts` INT NOT NULL ,
   `Password` VARCHAR(45) NULL ,
   `Email` VARCHAR(45) NULL ,
   `User_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_ID`) )
 ENGINE = InnoDB;


 -- -----------------------------------------------------
 -- Table `mydb`.`User_Space`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User_Space` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User_Space` (
   `User_UserName` VARCHAR(35) NOT NULL ,
   `User_Space_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_Space_ID`),
 FOREIGN KEY (`User_UserName`)
 REFERENCES `mydb`.`User` (`UserName`)
 ON UPDATE CASCADE ON DELETE CASCADE)
 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

الخطأ الذي ينتجه هذا هو:
رمز الخطأ: 1005 لا يمكن إنشاء جدول "mydb.user_space" (Errno: 150)

أي شخص يعرف ما هو الذي أفعله خطأ ؟؟ وأي شخص آخر لديه مشاكل في جيل البرنامج النصي الذي قام به طاولة عمل MySQL؟ إنها أداة رائعة ، لكنها مزعجة أنها تضخ البرامج النصية التي لا تعمل بالنسبة لي.

بصفته لمعلوماتك ، يمتلك البرنامج النصي الذي يمتلكه تلقائيًا:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `mydb` ;
 CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;

 -- -----------------------------------------------------
 -- Table `mydb`.`User`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User` (
   `UserName` VARCHAR(35) NOT NULL ,
   `Num_Accts` INT NOT NULL ,
   `Password` VARCHAR(45) NULL ,
   `Email` VARCHAR(45) NULL ,
   `User_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_ID`) )
 ENGINE = InnoDB;


 -- -----------------------------------------------------
 -- Table `mydb`.`User_Space`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User_Space` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User_Space` (
   `User_Space_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_Space_ID`) ,
   INDEX `User_ID` () ,
   CONSTRAINT `User_ID`
     FOREIGN KEY ()
     REFERENCES `mydb`.`User` ()
     ON DELETE NO ACTION
     ON UPDATE NO ACTION)
 ENGINE = InnoDB;


 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

** شكرًا!

هل كانت مفيدة؟

المحلول

لم أستخدم Workbench MySQL لإنشاء الكثير من المخططات ، لكنني وجدت المشكلة في البرنامج النصي. تعريف المفتاح الخارجي في User_Space يحاول الجدول إنشاء مفتاح خارجي على عمود غير متصل في User الطاولة. إذا قمت بتغيير User تعريف للحصول على فهرس على UserName, ، مثله:

  CREATE  TABLE IF NOT EXISTS `mydb`.`User` (
   `UserName` VARCHAR(35) NOT NULL ,
   `Num_Accts` INT NOT NULL ,
   `Password` VARCHAR(45) NULL ,
   `Email` VARCHAR(45) NULL ,
   `User_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_ID`),
   INDEX(`UserName`)
 )
 ENGINE = InnoDB;

... سينجح السيناريو. يبدو أن طاولة MySQL Workbench ربما لا تأخذ الفهارس في الاعتبار عند إنشاء تعريفات المفاتيح الخارجية. لست متأكدًا مما إذا كان بإمكانك إصلاح هذا في مخططات المخطط الخاصة بك أو إذا كان خطأ أكبر في البرنامج ، لكنني أرى ما إذا كان يمكنك إضافة تعريفات الفهرس في الأماكن المناسبة وتحديد ما إذا كان ذلك يعمل على إصلاح توليد البرنامج النصي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top