SQL design for a navigation menu with one of two columns - mysql

I have navigation menus which have links either to an external url, or to a local page identified by the pages PK pages_id.
To implement, I created the following tables.
pages stores the HTML for the center part in each page.
menus stores the name of the menu.
pages_has_menus adds the menu to the page, and specified whether it is a main menu, sub menu, etc as specified by menu_types.
menus_has_pages specifies the actual items in the menu.
How can I ensure that menus_has_pages doesn't contain both a pages_id and a external_url, and also always contains one or the other?
Should the schema be changed by adding addition tables for each scenario?
CREATE TABLE IF NOT EXISTS `pages` (
`id` INT UNSIGNED NOT NULL,
`sites_id` INT UNSIGNED NOT NULL,
`html` TEXT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_pages_sites_idx` (`sites_id` ASC),
CONSTRAINT `fk_pages_sites`
FOREIGN KEY (`sites_id`)
REFERENCES `sites` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `menu_types` (
`type` CHAR(4) NOT NULL,
PRIMARY KEY (`type`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `menus` (
`id` INT UNSIGNED NOT NULL,
`name` VARCHAR(45) NULL,
`sites_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_menus_sites1_idx` (`sites_id` ASC),
CONSTRAINT `fk_menus_sites1`
FOREIGN KEY (`sites_id`)
REFERENCES `sites` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `pages_has_menus` (
`pages_id` INT UNSIGNED NOT NULL,
`menus_id` INT UNSIGNED NOT NULL,
`menu_types_type` CHAR(4) NOT NULL,
PRIMARY KEY (`pages_id`, `menus_id`),
INDEX `fk_pages_has_menus_menus1_idx` (`menus_id` ASC),
INDEX `fk_pages_has_menus_pages1_idx` (`pages_id` ASC),
INDEX `fk_pages_has_menus_menu_types1_idx` (`menu_types_type` ASC),
UNIQUE INDEX `unique_menu` (`pages_id` ASC, `menu_types_type` ASC),
CONSTRAINT `fk_pages_has_menus_pages1`
FOREIGN KEY (`pages_id`)
REFERENCES `pages` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pages_has_menus_menus1`
FOREIGN KEY (`menus_id`)
REFERENCES `menus` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pages_has_menus_menu_types1`
FOREIGN KEY (`menu_types_type`)
REFERENCES `menu_types` (`type`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `menus_has_pages` (
`menus_id` INT UNSIGNED NOT NULL,
`pages_id` INT UNSIGNED NULL,
`external_url` VARCHAR(45) NULL,
`order` TINYINT NULL,
`name` VARCHAR(45) NULL,
`new_window` TINYINT NULL,
PRIMARY KEY (`menus_id`, `pages_id`),
INDEX `fk_menus_has_pages_pages1_idx` (`pages_id` ASC),
INDEX `fk_menus_has_pages_menus1_idx` (`menus_id` ASC),
CONSTRAINT `fk_menus_has_pages_menus1`
FOREIGN KEY (`menus_id`)
REFERENCES `menus` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_menus_has_pages_pages1`
FOREIGN KEY (`pages_id`)
REFERENCES `pages` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

I guess I would use two tables instead of yours:
one with:
pages_id INT UNSIGNED NOT NULL,
and one with :
external_url VARCHAR(45) NOT NULL,
And use 'UNION' when you need to merge two 'SELECT' queries.

Related

mysql sometimes removes and old index when adding a new index?

TL;DR
We've seen on a virtual machine, that adding a UNIQUE index causes an older non-UNIQUE index to be removed automatically.
I cannot reproduce this on any other machines (yet?), and if I do:
mysql -e 'create db2'
mysqldump db1 | mysql db2
before adding the new index to db1, and then try adding the index on db2 instead, the old index is not removed from db2. Funky!
We have a snapshot of the machine with db1, and can reproduce it there in the existing db1 database...
Anybody have any idea what is going on? We have scripts to automate adding/removing indexes, and that started failing because on that one machine, the old index didn't exist any longer.
When a dump/restore cycle causes the problem to go away, that makes it hard understand, reproduce and reduce the problem to a simple example.
Details
The table in question looked like this before adding the new index (from SHOW CREATE TABLE). Note the monitoredTableRowID KEY:
CREATE TABLE `cfgAttributeInstances` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`attributeID` int(10) unsigned DEFAULT NULL,
`nodeID` int(10) unsigned DEFAULT NULL,
`groupID` int(10) unsigned DEFAULT NULL,
`statisticID` int(10) unsigned DEFAULT NULL,
`nodeStatisticID` int(10) unsigned DEFAULT NULL,
`serviceID` int(10) unsigned DEFAULT NULL,
`nodeServiceID` int(10) unsigned DEFAULT NULL,
`nodeComponentID` int(10) unsigned DEFAULT NULL,
`syslogFilterID` int(10) unsigned DEFAULT NULL,
`value` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`ID`),
UNIQUE KEY `nodeID` (`nodeID`,`attributeID`),
UNIQUE KEY `groupID` (`groupID`,`attributeID`),
UNIQUE KEY `statisticID` (`statisticID`,`attributeID`),
UNIQUE KEY `nodeStatisticID` (`nodeStatisticID`,`attributeID`),
UNIQUE KEY `serviceID` (`serviceID`,`attributeID`),
UNIQUE KEY `nodeServiceID` (`nodeServiceID`,`attributeID`),
KEY `attributeID` (`attributeID`),
KEY `monitoredTableRowID` (`nodeComponentID`),
KEY `syslogFilterID` (`syslogFilterID`),
CONSTRAINT `cfgAttributeInstances_ibfk_1` FOREIGN KEY (`attributeID`) REFERENCES `cfgAttributes` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_2` FOREIGN KEY (`nodeID`) REFERENCES `cfgNodes` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_3` FOREIGN KEY (`groupID`) REFERENCES `cfgGroups` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_4` FOREIGN KEY (`statisticID`) REFERENCES `cfgStatistics` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_5` FOREIGN KEY (`nodeStatisticID`) REFERENCES `cfgNodeStatistics` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_6` FOREIGN KEY (`serviceID`) REFERENCES `cfgServices` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_7` FOREIGN KEY (`nodeServiceID`) REFERENCES `cfgNodeServices` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_8` FOREIGN KEY (`nodeComponentID`) REFERENCES `cfgNodeComponents` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_9` FOREIGN KEY (`syslogFilterID`) REFERENCES `cfgSyslogFilters` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='CapMon Attribute instances';
I added this index:
ALTER TABLE cfgAttributeInstances ADD
UNIQUE new_nodeComponentID (nodeComponentID, attributeID)
It looked like this after adding that index:
CREATE TABLE `cfgAttributeInstances` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`attributeID` int(10) unsigned DEFAULT NULL,
`nodeID` int(10) unsigned DEFAULT NULL,
`groupID` int(10) unsigned DEFAULT NULL,
`statisticID` int(10) unsigned DEFAULT NULL,
`nodeStatisticID` int(10) unsigned DEFAULT NULL,
`serviceID` int(10) unsigned DEFAULT NULL,
`nodeServiceID` int(10) unsigned DEFAULT NULL,
`nodeComponentID` int(10) unsigned DEFAULT NULL,
`syslogFilterID` int(10) unsigned DEFAULT NULL,
`value` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`ID`),
UNIQUE KEY `nodeID` (`nodeID`,`attributeID`),
UNIQUE KEY `groupID` (`groupID`,`attributeID`),
UNIQUE KEY `statisticID` (`statisticID`,`attributeID`),
UNIQUE KEY `nodeStatisticID` (`nodeStatisticID`,`attributeID`),
UNIQUE KEY `serviceID` (`serviceID`,`attributeID`),
UNIQUE KEY `nodeServiceID` (`nodeServiceID`,`attributeID`),
UNIQUE KEY `new_nodeComponentID` (`nodeComponentID`,`attributeID`),
KEY `attributeID` (`attributeID`),
KEY `syslogFilterID` (`syslogFilterID`),
CONSTRAINT `cfgAttributeInstances_ibfk_1` FOREIGN KEY (`attributeID`) REFERENCES `cfgAttributes` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_2` FOREIGN KEY (`nodeID`) REFERENCES `cfgNodes` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_3` FOREIGN KEY (`groupID`) REFERENCES `cfgGroups` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_4` FOREIGN KEY (`statisticID`) REFERENCES `cfgStatistics` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_5` FOREIGN KEY (`nodeStatisticID`) REFERENCES `cfgNodeStatistics` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_6` FOREIGN KEY (`serviceID`) REFERENCES `cfgServices` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_7` FOREIGN KEY (`nodeServiceID`) REFERENCES `cfgNodeServices` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_8` FOREIGN KEY (`nodeComponentID`) REFERENCES `cfgNodeComponents` (`ID`) ON DELETE CASCADE,
CONSTRAINT `cfgAttributeInstances_ibfk_9` FOREIGN KEY (`syslogFilterID`) REFERENCES `cfgSyslogFilters` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='CapMon Attribute instances';
But hey! Where did the monitoredTableRowID index go?
Again, I cannot reproduce this. If I do a mysqldump > dump.db/mysql < dump.db cycle, the monitoredTableRowID doesn't disappear...
Any ideas on what is going on?
The composite key with nodeComponentID causes the non-composite key with nodeComponentID to be redundant within the context of the foreign key reference it is used. MySQL automatically drops the redundant implicit index. The behavior is dependant on column index ordering, as the dropped index will always be the first column within the defined composite key. [sic]
The issue(s) are specifically caused by the automatic implicit index created when adding a foreign key CONSTRAINT, and the index(es) being explicitly defined in SHOW CREATE TABLE which is also used by mysqldump.
The index_name value is ignored if there is already an explicitly
defined index on the child table that can support the foreign key.
Otherwise, MySQL implicitly creates a foreign key index... [sic]
MySQL requires indexes on foreign keys and referenced keys so that
foreign key checks can be fast and not require a table scan. In the
referencing table, there must be an index where the foreign key
columns are listed as the first columns in the same order. Such an
index is created on the referencing table automatically if it does not
exist. This index might be silently dropped later, if you create
another index that can be used to enforce the foreign key constraint.
index_name, if given, is used as described previously. [sic]
To reproduce the issue
Implicit Key Example db-fiddle
Note - INDEX FK_BAR_FOO (foo_id) is not explicitly defined.
DROP TABLE IF EXISTS `BAR`;
DROP TABLE IF EXISTS `FOO`;
CREATE TABLE `FOO` (
`id` INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
;
CREATE TABLE `BAR` (
`id` INT(11) NOT NULL,
`foo_id` INT(11) NOT NULL,
`b` INT(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FK_BAR_FOO` FOREIGN KEY (`foo_id`) REFERENCES `FOO` (`id`) ON DELETE CASCADE
)
ENGINE=InnoDB
;
SHOW CREATE TABLE `BAR`;
Result
INDEX FK_BAR_FOO (foo_id) is explicitly defined in SHOW CREATE TABLE, but is implicitly created by MySQL.
CREATE TABLE `BAR` (
`id` INT(11) NOT NULL,
`foo_id` INT(11) NOT NULL,
`b` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX `FK_BAR_FOO` (`foo_id`),
CONSTRAINT `FK_BAR_FOO` FOREIGN KEY (`foo_id`) REFERENCES `FOO` (`id`) ON DELETE CASCADE
)
ENGINE=InnoDB
;
Composite Key Example: db-fiddle
ALTER TABLE `BAR`
ADD UNIQUE INDEX `foo_id_b` (`foo_id`, `b`);
SHOW CREATE TABLE `BAR`;
Result
foo_id index is removed due to being redundant.
Since foo_id is the first column within the composite key, the implicit foo_id index FK_BAR_FOO is removed.
CREATE TABLE `BAR` (
`id` INT(11) NOT NULL,
`foo_id` INT(11) NOT NULL,
`b` INT(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `foo_id_b` (`foo_id`, `b`),
CONSTRAINT `FK_BAR_FOO` FOREIGN KEY (`foo_id`) REFERENCES `FOO` (`id`) ON DELETE CASCADE
)
ENGINE=InnoDB
;
Explicit Key Example: db-fiddle
MySQL ignores the redundant indexes, if the table was created with an explicit index that satisfies the foreign key CONSTRAINT.
DROP TABLE IF EXISTS `BAR`;
DROP TABLE IF EXISTS `FOO`;
CREATE TABLE `FOO` (
`id` INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
;
CREATE TABLE `BAR` (
`id` INT(11) NOT NULL,
`foo_id` INT(11) NOT NULL,
`b` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX `FK_BAR_FOO` (`foo_id`),
CONSTRAINT `FK_BAR_FOO` FOREIGN KEY (`foo_id`) REFERENCES `FOO` (`id`) ON DELETE CASCADE
)
ENGINE=InnoDB
;
ALTER TABLE `BAR`
ADD UNIQUE INDEX `foo_id_b` (`foo_id`, `b`);
SHOW CREATE TABLE `BAR`;
Result
Composite-key index for foo_id, b and index on foo_id are created.
CREATE TABLE `BAR` (
`id` INT(11) NOT NULL,
`foo_id` INT(11) NOT NULL,
`b` INT(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `foo_id_b` (`foo_id`, `b`),
INDEX `FK_BAR_FOO` (`foo_id`),
CONSTRAINT `FK_BAR_FOO` FOREIGN KEY (`foo_id`) REFERENCES `FOO` (`id`) ON DELETE CASCADE
)
ENGINE=InnoDB
;
Solution
In your scripts, verify the index (does not) exist before attempting to drop/add the index.
IF NOT EXISTS(
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_NAME = 'cfgAttributeInstances'
AND INDEX_NAME = 'new_nodeComponentID'
AND INDEX_SCHEMA = 'DbName')
THEN
ALTER TABLE `cfgAttributeInstances`
ADD UNIQUE INDEX `new_nodeComponentID` (`nodeComponentID`,`attributeID`);
END IF;
IF EXISTS (
SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_NAME = 'cfgAttributeInstances'
AND INDEX_NAME = 'nodeComponentID'
AND INDEX_SCHEMA = 'DbName')
THEN
ALTER TABLE `cfgAttributeInstances`
DROP INDEX `nodeComponentID`;
END IF;

MySQL Error when adding several foreign keys of the same type to one table

MySQL Error Code: 1822. Failed to add the foreign key constraint. Missing index for constraint 'fkUsers6' in the reference table 'users'
Happens when there is more than one foreign key of the same type in the table. Any idea to solve this? I haven't found answers to this case yet ...
Table in which the error occurs:
CREATE TABLE IF NOT EXISTS `profiCRM`.`opportunities` (
`ID` INT NOT NULL AUTO_INCREMENT,
`opportunity_belongsTo` INT NULL,
`opportunity_description` VARCHAR(45) NOT NULL,
`opportunity_type` INT NOT NULL,
`opportunity_stage` INT NOT NULL,
`opportunity_product` INT NOT NULL,
`opportunity_volume` INT NOT NULL,
`opportunity_dateCreated` DATETIME NOT NULL,
`opportunity_createdFrom` INT NOT NULL,
`opportunity_datePlannedClosure` DATE NOT NULL,
`opportunity_dateChanged` DATETIME NULL,
`opportunity_changedFrom` INT NULL,
`opportunity_dateClosed` DATETIME NULL,
`opportunity_closedFrom` INT NULL,
`opportunity_dateDeleted` DATETIME NULL,
`opportunity_deletedFrom` INT NULL,
PRIMARY KEY (`ID`));
Creation of the foreign keys:
ALTER TABLE `profiCRM`.`opportunities`
ADD INDEX `fkAccounts_idx` (`opportunity_belongsTo` ASC),
ADD INDEX `fkOpportunityStage_idx` (`opportunity_stage` ASC),
ADD INDEX `fkOpportunityType_idx` (`opportunity_type` ASC),
ADD INDEX `fkProducts_idx` (`opportunity_product` ASC),
ADD INDEX `fkUsers_idx` (`opportunity_createdFrom` ASC, `opportunity_changedFrom` ASC, `opportunity_closedFrom` ASC, `opportunity_deletedFrom` ASC),
ADD CONSTRAINT `fkAccounts6`
FOREIGN KEY (`opportunity_belongsTo`)
REFERENCES `profiCRM`.`accounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fkOpportunityStage6`
FOREIGN KEY (`opportunity_stage`)
REFERENCES `profiCRM`.`opportunityStage` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fkOpportunityType6`
FOREIGN KEY (`opportunity_type`)
REFERENCES `profiCRM`.`opportunityTypes` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fkProducts6`
FOREIGN KEY (`opportunity_product`)
REFERENCES `profiCRM`.`products` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fkUsers6`
FOREIGN KEY (`opportunity_createdFrom` , `opportunity_changedFrom` , `opportunity_closedFrom` , `opportunity_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID` , `ID` , `ID` , `ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Table of which the foreign key is from:
CREATE TABLE IF NOT EXISTS `profiCRM`.`users` (
`ID` INT NOT NULL AUTO_INCREMENT,
`user_belongsTo` INT NOT NULL,
`user_firstName` VARCHAR(45) NOT NULL,
`user_lastName` VARCHAR(45) NOT NULL,
`user_dateOfBirth` DATE NOT NULL,
`user_adress1` VARCHAR(45) NOT NULL,
`user_adress2` VARCHAR(45) NULL,
`user_department` VARCHAR(45) NOT NULL,
`user_zipcode` VARCHAR(10) NOT NULL,
`user_city` VARCHAR(45) NOT NULL,
`user_state` VARCHAR(45) NULL,
`user_country` INT NOT NULL,
`user_email` VARCHAR(45) NOT NULL,
`user_telephoneFixed` VARCHAR(45) NULL,
`user_telephoneMobile` VARCHAR(45) NULL,
`user_rightViewData` INT NOT NULL,
`user_rightCreateData` TINYINT NULL,
`user_rightCreateUser` TINYINT NULL,
`user_rightCreateAttribute` TINYINT NULL,
`user_rightCreateList` TINYINT NULL,
`user_rightEditData` TINYINT NULL,
`user_rightEditUser` TINYINT NULL,
`user_rightEditAttribute` TINYINT NULL,
`user_rightEditList` TINYINT NULL,
`user_rightDeleteData` TINYINT NULL,
`user_rightDeleteUser` TINYINT NULL,
`user_rightDeleteAttribute` TINYINT NULL,
`user_rightDeleteList` TINYINT NULL,
`user_dateCreated` DATETIME NOT NULL,
`user_createdFrom` INT NULL,
`user_dateChanged` DATETIME NULL,
`user_changedFrom` INT NULL,
`user_dateDeleted` DATETIME NULL,
`user_deletedFrom` INT NULL,
PRIMARY KEY (`ID`));
Here the solution: (I had to define an own foreign key for every
single list item, the possibility to select several items for one key
in the MySQL Workbench is not such purposeful)
-- MySQL Script generated by MySQL Workbench
-- Wed Oct 25 14:20:25 2017
-- Model: New Model Version: 1.0
-- MySQL Workbench Forward Engineering
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,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema profiCRM
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema profiCRM
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `profiCRM` DEFAULT CHARACTER SET utf8 ;
SHOW WARNINGS;
USE `profiCRM` ;
-- -----------------------------------------------------
-- Table `profiCRM`.`countries`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`countries` (
`ID` INT NOT NULL AUTO_INCREMENT,
`countryName` VARCHAR(45) NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`users` (
`ID` INT NOT NULL AUTO_INCREMENT,
`user_belongsTo` INT NOT NULL,
`user_firstName` VARCHAR(45) NOT NULL,
`user_lastName` VARCHAR(45) NOT NULL,
`user_dateOfBirth` DATE NOT NULL,
`user_adress1` VARCHAR(45) NOT NULL,
`user_adress2` VARCHAR(45) NULL,
`user_department` VARCHAR(45) NOT NULL,
`user_zipcode` VARCHAR(10) NOT NULL,
`user_city` VARCHAR(45) NOT NULL,
`user_state` VARCHAR(45) NULL,
`user_country` INT NOT NULL,
`user_email` VARCHAR(45) NOT NULL,
`user_telephoneFixed` VARCHAR(45) NULL,
`user_telephoneMobile` VARCHAR(45) NULL,
`user_rightViewData` INT NOT NULL,
`user_rightCreateData` TINYINT NULL,
`user_rightCreateUser` TINYINT NULL,
`user_rightCreateAttribute` TINYINT NULL,
`user_rightCreateList` TINYINT NULL,
`user_rightEditData` TINYINT NULL,
`user_rightEditUser` TINYINT NULL,
`user_rightEditAttribute` TINYINT NULL,
`user_rightEditList` TINYINT NULL,
`user_rightDeleteData` TINYINT NULL,
`user_rightDeleteUser` TINYINT NULL,
`user_rightDeleteAttribute` TINYINT NULL,
`user_rightDeleteList` TINYINT NULL,
`user_dateCreated` DATETIME NOT NULL,
`user_createdFrom` INT NULL,
`user_dateChanged` DATETIME NULL,
`user_changedFrom` INT NULL,
`user_dateDeleted` DATETIME NULL,
`user_deletedFrom` INT NULL,
PRIMARY KEY (`ID`),
INDEX `fkCountries_idx` (`user_country` ASC),
INDEX `fkUsers_idx` (`user_rightViewData` ASC),
INDEX `fkCorporateAccounts_idx` (`user_belongsTo` ASC),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC),
INDEX `fkUsersToCreatedFrom_idx` (`user_createdFrom` ASC),
INDEX `fkUsersToChangedFrom_idx` (`user_changedFrom` ASC),
INDEX `fkUsersToDeletedFrom_idx` (`user_deletedFrom` ASC),
CONSTRAINT `fkCountries2`
FOREIGN KEY (`user_country`)
REFERENCES `profiCRM`.`countries` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToRightViewData2`
FOREIGN KEY (`user_rightViewData`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkCorporateAccounts2`
FOREIGN KEY (`user_belongsTo`)
REFERENCES `profiCRM`.`corporateAccounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToCreatedFrom2`
FOREIGN KEY (`user_createdFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToChangedFrom2`
FOREIGN KEY (`user_changedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToDeletedFrom2`
FOREIGN KEY (`user_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`corporateAccounts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`corporateAccounts` (
`ID` INT NOT NULL AUTO_INCREMENT,
`corporateAccount_name1` VARCHAR(45) NOT NULL,
`corporateAccount_name2` VARCHAR(45) NULL,
`corporateAccount_adress1` VARCHAR(45) NOT NULL,
`corporateAccount_adress2` VARCHAR(45) NULL,
`corporateAccount_department` VARCHAR(45) NULL,
`corporateAccount_zipcode` VARCHAR(10) NOT NULL,
`corporateAccount_city` VARCHAR(45) NOT NULL,
`corporateAccount_state` VARCHAR(45) NULL,
`corporateAccount_country` INT NOT NULL,
`corporateAccount_parentTo` INT NULL,
`corporateAccount_childOf` INT NULL,
`corporateAccount_dateCreated` DATETIME NOT NULL,
`corporateAccount_dateChanged` DATETIME NULL,
`corporateAccount_changedFrom` INT NULL,
`corporateAccount_dateDeleted` DATETIME NULL,
`corporateAccount_deletedFrom` INT NULL,
PRIMARY KEY (`ID`),
INDEX `fkCountries_idx` (`corporateAccount_country` ASC),
INDEX `fkCorporateAccounts_idx` (`corporateAccount_parentTo` ASC),
INDEX `fkUsers_idx` (`corporateAccount_changedFrom` ASC),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC),
INDEX `fkUsersDeletedFrom_idx` (`corporateAccount_deletedFrom` ASC),
INDEX `fkCorporateAccountsToChildOf1_idx` (`corporateAccount_childOf` ASC),
CONSTRAINT `fkCountries1`
FOREIGN KEY (`corporateAccount_country`)
REFERENCES `profiCRM`.`countries` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkCorporateAccountsToParentTo1`
FOREIGN KEY (`corporateAccount_parentTo`)
REFERENCES `profiCRM`.`corporateAccounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToChangedFrom1`
FOREIGN KEY (`corporateAccount_changedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToDeletedFrom1`
FOREIGN KEY (`corporateAccount_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkCorporateAccountsToChildOf1`
FOREIGN KEY (`corporateAccount_childOf`)
REFERENCES `profiCRM`.`corporateAccounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`accountTypes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`accountTypes` (
`ID` INT NOT NULL AUTO_INCREMENT,
`accountType_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`competition`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`competition` (
`ID` INT NOT NULL AUTO_INCREMENT,
`competition_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`opportunityStage`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`opportunityStage` (
`ID` INT NOT NULL AUTO_INCREMENT,
`opportunityStage_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`opportunityTypes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`opportunityTypes` (
`ID` INT NOT NULL AUTO_INCREMENT,
`opportunityType_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`products`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`products` (
`ID` INT NOT NULL AUTO_INCREMENT,
`product_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`opportunities`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`opportunities` (
`ID` INT NOT NULL AUTO_INCREMENT,
`opportunity_belongsTo` INT NULL,
`opportunity_description` VARCHAR(45) NOT NULL,
`opportunity_type` INT NOT NULL,
`opportunity_stage` INT NOT NULL,
`opportunity_product` INT NOT NULL,
`opportunity_volume` INT NOT NULL,
`opportunity_dateCreated` DATETIME NOT NULL,
`opportunity_createdFrom` INT NOT NULL,
`opportunity_datePlannedClosure` DATE NOT NULL,
`opportunity_dateChanged` DATETIME NULL,
`opportunity_changedFrom` INT NULL,
`opportunity_dateClosed` DATETIME NULL,
`opportunity_closedFrom` INT NULL,
`opportunity_dateDeleted` DATETIME NULL,
`opportunity_deletedFrom` INT NULL,
PRIMARY KEY (`ID`),
INDEX `fkAccounts_idx` (`opportunity_belongsTo` ASC),
INDEX `fkOpportunityStage_idx` (`opportunity_stage` ASC),
INDEX `fkOpportunityType_idx` (`opportunity_type` ASC),
INDEX `fkProducts_idx` (`opportunity_product` ASC),
INDEX `fkUsers_idx` (`opportunity_createdFrom` ASC),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC),
INDEX `fkUsersToChangedFrom6_idx` (`opportunity_changedFrom` ASC),
INDEX `fkUsersToClosedFrom6_idx` (`opportunity_closedFrom` ASC),
INDEX `fkUsersToDeletedFrom6_idx` (`opportunity_deletedFrom` ASC),
CONSTRAINT `fkAccounts6`
FOREIGN KEY (`opportunity_belongsTo`)
REFERENCES `profiCRM`.`accounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkOpportunityStage6`
FOREIGN KEY (`opportunity_stage`)
REFERENCES `profiCRM`.`opportunityStage` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkOpportunityType6`
FOREIGN KEY (`opportunity_type`)
REFERENCES `profiCRM`.`opportunityTypes` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkProducts6`
FOREIGN KEY (`opportunity_product`)
REFERENCES `profiCRM`.`products` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToCreatedFrom6`
FOREIGN KEY (`opportunity_createdFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToChangedFrom6`
FOREIGN KEY (`opportunity_changedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToClosedFrom6`
FOREIGN KEY (`opportunity_closedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToDeletedFrom6`
FOREIGN KEY (`opportunity_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`accounts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`accounts` (
`ID` INT NOT NULL AUTO_INCREMENT,
`account_belongsTo` INT NOT NULL,
`account_kindOf` INT NOT NULL,
`account_name1` VARCHAR(45) NOT NULL,
`account_name2` VARCHAR(45) NULL,
`account_adress1` VARCHAR(45) NOT NULL,
`account_adress2` VARCHAR(45) NULL,
`account_zipcode` VARCHAR(45) NOT NULL,
`account_city` VARCHAR(45) NOT NULL,
`account_state` VARCHAR(45) NULL,
`account_country` INT NOT NULL,
`account_email` VARCHAR(45) NULL,
`account_telephoneFixed` VARCHAR(45) NULL,
`account_telephoneMobile` VARCHAR(45) NULL,
`account_fax` VARCHAR(45) NULL,
`account_internet` VARCHAR(45) NULL,
`account_childOf` INT NULL,
`account_parentTo` INT NULL,
`account_turnover` INT NULL,
`account_numberEmployees` INT NULL,
`account_numberSubsidaries` VARCHAR(45) NULL,
`account_generalInfo` VARCHAR(2000) NULL,
`account_competition` INT NULL,
`account_opportunities` INT NULL,
`account_dateCreated` DATETIME NULL,
`account_createdFrom` INT NULL,
`account_dateChanged` DATETIME NULL,
`account_changedFrom` INT NULL,
`account_dateDeleted` DATETIME NULL,
`account_deletedFrom` INT NULL,
PRIMARY KEY (`ID`),
INDEX `fkUsers_idx` (`account_belongsTo` ASC),
INDEX `fkCountries_idx` (`account_country` ASC),
INDEX `fkAccounts_idx` (`account_childOf` ASC),
INDEX `fkAccountTypes_idx` (`account_kindOf` ASC),
INDEX `fkCompetition_idx` (`account_competition` ASC),
INDEX `fkOpportunities_idx` (`account_opportunities` ASC),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC),
INDEX `FKUsersToCreatedFrom3_idx` (`account_createdFrom` ASC),
INDEX `fkUsersToChangedFrom3_idx` (`account_changedFrom` ASC),
INDEX `fkUsersToDeletedFrom3_idx` (`account_deletedFrom` ASC),
INDEX `fkAccountsToParentTo3_idx` (`account_parentTo` ASC),
CONSTRAINT `fkUsersToBelongsTo3`
FOREIGN KEY (`account_belongsTo`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkCountries3`
FOREIGN KEY (`account_country`)
REFERENCES `profiCRM`.`countries` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkAccountsToChildOf3`
FOREIGN KEY (`account_childOf`)
REFERENCES `profiCRM`.`accounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkAccountTypes3`
FOREIGN KEY (`account_kindOf`)
REFERENCES `profiCRM`.`accountTypes` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkCompetition3`
FOREIGN KEY (`account_competition`)
REFERENCES `profiCRM`.`competition` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkOpportunities3`
FOREIGN KEY (`account_opportunities`)
REFERENCES `profiCRM`.`opportunities` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToCreatedFrom3`
FOREIGN KEY (`account_createdFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToChangedFrom3`
FOREIGN KEY (`account_changedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToDeletedFrom3`
FOREIGN KEY (`account_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkAccountsToParentTo3`
FOREIGN KEY (`account_parentTo`)
REFERENCES `profiCRM`.`accounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`formOfAdress`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`formOfAdress` (
`ID` INT NOT NULL AUTO_INCREMENT,
`formOfAdress_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`contacts`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`contacts` (
`ID` INT NOT NULL AUTO_INCREMENT,
`contact_belongsTo` INT NOT NULL,
`contact_formOfAdress` INT NOT NULL,
`contact_title` VARCHAR(45) NULL,
`contact_firstName` VARCHAR(45) NOT NULL,
`contact_lastName` VARCHAR(45) NOT NULL,
`contact_function` VARCHAR(45) NOT NULL,
`contact_department` VARCHAR(45) NOT NULL,
`contact_telephoneFixed` VARCHAR(45) NULL,
`contact_telephoneMobile` VARCHAR(45) NULL,
`contact_email` VARCHAR(45) NULL,
`contact_fax` VARCHAR(45) NULL,
`contact_dateOfBirth` DATE NULL,
`contact_childOf` INT NULL,
`contact_parentTo` INT NULL,
`contact_generalInfo` VARCHAR(2000) NULL,
`contact_dateCreated` DATETIME NULL,
`contact_createdFrom` INT NULL,
`contact_dateChanged` DATETIME NULL,
`contact_changedFrom` INT NULL,
`contact_dateDeleted` DATETIME NULL,
`contact_deletedFrom` INT NULL,
PRIMARY KEY (`ID`),
INDEX `fkAccounts_idx` (`contact_belongsTo` ASC),
INDEX `fkFormOfAdress_idx` (`contact_formOfAdress` ASC),
INDEX `fkContacts_idx` (`contact_childOf` ASC),
INDEX `fkUsers_idx` (`contact_createdFrom` ASC),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC),
INDEX `fkContactsToParentTo4_idx` (`contact_parentTo` ASC),
INDEX `fkUsersToChangedFrom4_idx` (`contact_changedFrom` ASC),
INDEX `fkUsersToDeletedFrom4_idx` (`contact_deletedFrom` ASC),
CONSTRAINT `fkAccounts4`
FOREIGN KEY (`contact_belongsTo`)
REFERENCES `profiCRM`.`accounts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkFormOfAdress4`
FOREIGN KEY (`contact_formOfAdress`)
REFERENCES `profiCRM`.`formOfAdress` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkContactsToChildOf4`
FOREIGN KEY (`contact_childOf`)
REFERENCES `profiCRM`.`contacts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToCreatedFrom4`
FOREIGN KEY (`contact_createdFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkContactsToParentTo4`
FOREIGN KEY (`contact_parentTo`)
REFERENCES `profiCRM`.`contacts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToChangedFrom4`
FOREIGN KEY (`contact_changedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToDeletedFrom4`
FOREIGN KEY (`contact_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`activityType`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`activityType` (
`ID` INT NOT NULL AUTO_INCREMENT,
`activityType_description` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC))
ENGINE = InnoDB;
SHOW WARNINGS;
-- -----------------------------------------------------
-- Table `profiCRM`.`activities`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `profiCRM`.`activities` (
`ID` INT NOT NULL AUTO_INCREMENT,
`activity_belongsToContact` INT NOT NULL,
`activity_belongsToUser` INT NULL,
`activity_type` INT NOT NULL,
`activity_dateStart` DATETIME NOT NULL,
`activity_dateEnde` DATETIME NOT NULL,
`activity_childOf` INT NULL,
`activity_goal` VARCHAR(2000) NOT NULL,
`activity_result` VARCHAR(2000) NULL,
`activity_todo` VARCHAR(2000) NULL,
`activity_todoTimeframe` DATE NULL,
`activity_dateCreated` DATETIME NOT NULL,
`activity_createdFrom` INT NOT NULL,
`activity_dateChanged` DATETIME NULL,
`activity_changedFrom` INT NULL,
`activity_dateClosed` DATETIME NULL,
`activity_closedFrom` INT NULL,
`activity_dateDeleted` DATETIME NULL,
`activity_deletedFrom` INT NULL,
PRIMARY KEY (`ID`),
INDEX `fkActivityTypes_idx` (`activity_type` ASC),
INDEX `fkContacts_idx` (`activity_belongsToContact` ASC),
INDEX `fkUsers_idx` (`activity_belongsToUser` ASC),
INDEX `fkActivities_idx` (`activity_childOf` ASC),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC),
INDEX `fkUserToCreatedFrom5_idx` (`activity_createdFrom` ASC),
INDEX `fkUserToChangedFrom5_idx` (`activity_changedFrom` ASC),
INDEX `fkUserToClosedFrom5_idx` (`activity_closedFrom` ASC),
INDEX `fkUserToDeletedFrom5_idx` (`activity_deletedFrom` ASC),
CONSTRAINT `fkActivityTypes5`
FOREIGN KEY (`activity_type`)
REFERENCES `profiCRM`.`activityType` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkContacts5`
FOREIGN KEY (`activity_belongsToContact`)
REFERENCES `profiCRM`.`contacts` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUsersToBelongsToUser5`
FOREIGN KEY (`activity_belongsToUser`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkActivities5`
FOREIGN KEY (`activity_childOf`)
REFERENCES `profiCRM`.`activities` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUserToCreatedFrom5`
FOREIGN KEY (`activity_createdFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUserToChangedFrom5`
FOREIGN KEY (`activity_changedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUserToClosedFrom5`
FOREIGN KEY (`activity_closedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fkUserToDeletedFrom5`
FOREIGN KEY (`activity_deletedFrom`)
REFERENCES `profiCRM`.`users` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SHOW WARNINGS;
SET SQL_MODE=#OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=#OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=#OLD_UNIQUE_CHECKS;
Creating a foreign key from the four columns opportunities(opportunity_createdFrom, opportunity_changedFrom, opportunity_closedFrom, opportunity_deletedFrom) to the (non-existing) index users (ID , ID , ID , ID) doesn't make any sense. In fact, you can't create an index with duplicate columns like you try (unintentionally).
What you really want to do is to define separated foreign keys for the four columns of the opportunities table to the id column in the users table.

Cannot add foreign key constraint, workbench

I used workbench to implement a database schema, but I'm getting this error when using foreign keys in a certain table.
1215 - Cannot add foreign key constraint
SQL query:
CREATE TABLE IF NOT EXISTS `Gam3ty`.`Frequently_Used_Location` (
`idFrequently_Used_Location` INT NOT NULL,
`User_idUser` INT NOT NULL,
`User_College_idCollege` INT NOT NULL,
PRIMARY KEY (`idFrequently_Used_Location`,`User_idUser`,`User_College_idCollege`),
INDEX `fk_Frequently_Used_Location_User1_idx` (`User_idUser` ASC,`User_College_idCollege` ASC),
CONSTRAINT `fk_Frequently_Used_Location_User1`
FOREIGN KEY (`User_idUser` , `User_College_idCollege`)
REFERENCES `Gam3ty`.`User` (`idUser` , `College_idCollege`)
my SQL:
CREATE SCHEMA IF NOT EXISTS `Gam3ty` DEFAULT CHARACTER SET utf8 ;
USE `Gam3ty` ;
-- -----------------------------------------------------
-- Table `Gam3ty`.`Frequently_Used_Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`Frequently_Used_Location` (
`idFrequently_Used_Location` INT NOT NULL,
`User_idUser` INT NOT NULL,
`User_College_idCollege` INT NOT NULL,
PRIMARY KEY (`idFrequently_Used_Location`, `User_idUser`, `User_College_idCollege`),
INDEX `fk_Frequently_Used_Location_User1_idx` (`User_idUser` ASC, `User_College_idCollege` ASC),
CONSTRAINT `fk_Frequently_Used_Location_User1`
FOREIGN KEY (`User_idUser` , `User_College_idCollege`)
REFERENCES `Gam3ty`.`User` (`idUser` , `College_idCollege`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`Location` (
`idLocation` INT NOT NULL,
`Frequently_Used_Location_idFrequently_Used_Location` INT NOT NULL,
`Frequently_Used_Location_User_idUser` INT NOT NULL,
`Frequently_Used_Location_User_College_idCollege` INT NOT NULL,
`type` VARCHAR(45) NULL,
PRIMARY KEY (`idLocation`),
INDEX `fk_Location_Frequently_Used_Location1_idx` (`Frequently_Used_Location_idFrequently_Used_Location` ASC, `Frequently_Used_Location_User_idUser` ASC, `Frequently_Used_Location_User_College_idCollege` ASC),
CONSTRAINT `fk_Location_Frequently_Used_Location1`
FOREIGN KEY (`Frequently_Used_Location_idFrequently_Used_Location` , `Frequently_Used_Location_User_idUser` , `Frequently_Used_Location_User_College_idCollege`)
REFERENCES `Gam3ty`.`Frequently_Used_Location` (`idFrequently_Used_Location`, `User_idUser` , `User_College_idCollege`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`University`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`University` (
`idUniversity` INT NOT NULL,
`Location_idLocation` INT NOT NULL,
`Info` VARCHAR(45) NULL,
PRIMARY KEY (`idUniversity`, `Location_idLocation`),
INDEX `fk_University_Location1_idx` (`Location_idLocation` ASC),
CONSTRAINT `fk_University_Location1`
FOREIGN KEY (`Location_idLocation`)
REFERENCES `Gam3ty`.`Location` (`idLocation`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`College`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`College` (
`idCollege` INT NOT NULL,
`University_idUniversity` INT NOT NULL,
`Location_idLocation` INT NOT NULL,
`Info` VARCHAR(45) NULL,
`Staff` VARCHAR(45) NULL,
`Department` VARCHAR(45) NULL,
PRIMARY KEY (`idCollege`, `University_idUniversity`, `Location_idLocation`),
INDEX `fk_College_University1_idx` (`University_idUniversity` ASC),
INDEX `fk_College_Location1_idx` (`Location_idLocation` ASC),
CONSTRAINT `fk_College_University1`
FOREIGN KEY (`University_idUniversity`)
REFERENCES `Gam3ty`.`University` (`idUniversity`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_College_Location1`
FOREIGN KEY (`Location_idLocation`)
REFERENCES `Gam3ty`.`Location` (`idLocation`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Gam3ty`.`User`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Gam3ty`.`User` (
`idUser` INT NOT NULL,
`College_idCollege` INT NOT NULL,
`UserName` VARCHAR(45) NOT NULL,
`Password` VARCHAR(45) NOT NULL,
`E-mail` VARCHAR(45) NOT NULL,
`Social_media_accounts` VARCHAR(45) NULL,
`Gender` VARCHAR(45) NOT NULL,
`Job` VARCHAR(45) NOT NULL,
`Tel-num` BIGINT(11) NULL,
`Adress` VARCHAR(45) NULL,
PRIMARY KEY (`idUser`, `College_idCollege`, `UserName`),
INDEX `fk_User_College_idx` (`College_idCollege` ASC),
CONSTRAINT `fk_User_College`
FOREIGN KEY (`College_idCollege`)
REFERENCES `Gam3ty`.`College` (`idCollege`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
I checked the datatypes and they are all the same, also every foreign key is a primary key in it's original table.
Tables are created in order from top to bottom when you run a SQL script.
You can't create a foreign key that references a table that hasn't been created yet.
You must order the tables so that each table is created before any tables that reference it.
#Rahul wrote:
You need to refer all of the columns designated as primary key.
I agree this is a recommended practice, because otherwise you can create a foreign key where a given row references multiple rows in the parent table. This leads to ambiguous semantics. For instance, can you delete a row in the parent table if there's a row referencing it in the child table, but there's a second row in the parent table that satisfies the reference? This breaks the definition of referential integrity in standard SQL.
Nevertheless, InnoDB allows it. You can make a foreign key that references any left-most subset of columns of any key (unique or non-unique). It's a very bad idea, but InnoDB lets you do it and does not throw an error.
The following is crazy, but it's not an error to InnoDB:
create table foo (a int, b int, key (a, b));
create table bar (a int, foreign key (a) references foo(a));
That's cause table Gam3ty.User defines primary key on 3 columns as seen below but you are referencing only two of them. which creates partial functional dependency. You need to refer all of the columns designated as primary key
CREATE TABLE IF NOT EXISTS `Gam3ty`.`User` (
....
PRIMARY KEY (`idUser`, `College_idCollege`, `UserName`)
Your referencing table
FOREIGN KEY (`User_idUser` , `User_College_idCollege`)
REFERENCES `Gam3ty`.`User` (`idUser` , `College_idCollege`)

MySQL duplicate key error

If I run this code all work well, but if uncomment last constraint, I got the following error:
Error Code: 1022. Can't write; duplicate key in table 'transfer'
but there no another key 'fk_component_id', what wrong with this code?
-- -----------------------------------------------------
-- Table `pcdb`.`transfer`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `pcdb`.`transfer` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`component_id` INT UNSIGNED NOT NULL,
`type` INT NULL,
`parent_id` INT UNSIGNED NULL,
`source_id` INT UNSIGNED NULL,
`contractor_id` INT UNSIGNED NULL,
`src_department_id` INT UNSIGNED NULL,
`dest_department_id` INT UNSIGNED NULL,
`session_id` INT UNSIGNED NOT NULL,
`count` INT UNSIGNED NOT NULL,
`comment` TEXT(65535) NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
CONSTRAINT `fk_src_department_id`
FOREIGN KEY (`src_department_id`)
REFERENCES `pcdb`.`department` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_income_id`
FOREIGN KEY (`source_id`)
REFERENCES `pcdb`.`transfer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_contractor_id`
FOREIGN KEY (`contractor_id`)
REFERENCES `pcdb`.`contractor` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_session_id`
FOREIGN KEY (`session_id`)
REFERENCES `pcdb`.`session` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_dest_department_id`
FOREIGN KEY (`dest_department_id`)
REFERENCES `pcdb`.`department` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_parent_id`
FOREIGN KEY (`parent_id`)
REFERENCES `pcdb`.`transfer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION/*,
CONSTRAINT `fk_component_id`
FOREIGN KEY (`component_id`)
REFERENCES `pcdb`.`component` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION*/);
It sounds like you may already have a constraint with that name on a different table in the database. Try changing the name of that constraint to something like "fk_transfer_component_id" and see if you still get the error.

#1005 - Can't create table

i'm trying to create some tables in my db but my phpmyadmin is displying the error 1005 - Can't create table, on table tbapp_por_tbpais, below is mysql, cam someone help me ?
Table tbApp
CREATE TABLE IF NOT EXISTS `tbApp` (
`app_cod` INT NOT NULL,
`app_nome` VARCHAR(45) NULL,
`app_cod_do_app` VARCHAR(45) NULL,
`app_pac_fit_qtde` VARCHAR(10) NULL,
`app_pac_flex_qtde` VARCHAR(45) NULL,
`app_pac_mega_qtde` VARCHAR(45) NULL,
`app_trial` VARCHAR(1) NULL,
`app_trial_dias` VARCHAR(4) NULL,
`app_pac_fit_preco` VARCHAR(45) NULL,
`app_pac_flex_preco` VARCHAR(45) NULL,
`app_pac_mega_preço` VARCHAR(45) NULL,
PRIMARY KEY (`app_cod`))
ENGINE = InnoDB;
Table cupomDesc
CREATE TABLE IF NOT EXISTS `cupomDesc` (
`cupom_cod` INT NOT NULL,
`cupom_cod_desc` VARCHAR(45) NULL,
`cupom_valido_ate` DATETIME NULL,
`cupom_exp_percent` VARCHAR(45) NULL,
PRIMARY KEY (`cupom_cod`))
ENGINE = InnoDB;
Table tela
CREATE TABLE IF NOT EXISTS `tela` (
`tela_cod` INT NOT NULL,
`tela_nome` VARCHAR(45) NULL,
PRIMARY KEY (`tela_cod`))
ENGINE = InnoDB;
Table tbHelptips
CREATE TABLE IF NOT EXISTS `tbHelptips` (
`help_cod` INT NOT NULL,
`help_texto` VARCHAR(45) NULL,
`tela_tela_cod` INT NOT NULL,
PRIMARY KEY (`help_cod`),
INDEX `fk_tbHelptips_tela1_idx` (`tela_tela_cod` ASC),
CONSTRAINT `fk_tbHelptips_tela1`
FOREIGN KEY (`tela_tela_cod`)
REFERENCES `tela` (`tela_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Table tbApp_por_tbPais
CREATE TABLE IF NOT EXISTS `tbApp_por_tbPais` (
`tbApp_app_cod` INT NOT NULL,
`tbPais_id` INT(11) NOT NULL,
PRIMARY KEY (`tbApp_app_cod`, `tbPais_id`),
INDEX `fk_tbApp_has_tbPais_tbPais1_idx` (`tbPais_id` ASC),
INDEX `fk_tbApp_has_tbPais_tbApp1_idx` (`tbApp_app_cod` ASC),
CONSTRAINT `fk_tbApp_has_tbPais_tbApp1`
FOREIGN KEY (`tbApp_app_cod`)
REFERENCES `tbApp` (`app_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tbApp_has_tbPais_tbPais1`
FOREIGN KEY (`tbPais_id`)
REFERENCES `tbPais` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Table tbRevenda_has_tbApp
CREATE TABLE IF NOT EXISTS `tbRevenda_has_tbApp` (
`tbRevenda_id` INT(11) NOT NULL,
`tbApp_app_cod` INT NOT NULL,
`tbApp_Qtde` VARCHAR(45) NULL,
PRIMARY KEY (`tbRevenda_id`, `tbApp_app_cod`),
INDEX `fk_tbRevenda_has_tbApp_tbApp1_idx` (`tbApp_app_cod` ASC),
INDEX `fk_tbRevenda_has_tbApp_tbRevenda1_idx` (`tbRevenda_id` ASC),
CONSTRAINT `fk_tbRevenda_has_tbApp_tbRevenda1`
FOREIGN KEY (`tbRevenda_id`)
REFERENCES `tbRevenda` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tbRevenda_has_tbApp_tbApp1`
FOREIGN KEY (`tbApp_app_cod`)
REFERENCES `tbApp` (`app_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Table mvx_serial
CREATE TABLE IF NOT EXISTS `mvx_serial` (
`mvx_cod` INT NOT NULL,
`mvx_num_serial` VARCHAR(45) NULL,
`tbPais_id` INT(11) NOT NULL,
PRIMARY KEY (`mvx_cod`),
INDEX `fk_mvx_serial_tbPais1_idx` (`tbPais_id` ASC),
CONSTRAINT `fk_mvx_serial_tbPais1`
FOREIGN KEY (`tbPais_id`)
REFERENCES `tbPais` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Table cambio
CREATE TABLE IF NOT EXISTS `cambio` (
`combio_cod` INT NOT NULL,
`cambio_valor` VARCHAR(45) NULL,
PRIMARY KEY (`combio_cod`))
ENGINE = InnoDB;
Table historico
CREATE TABLE IF NOT EXISTS `historico` (
`hist_cod` INT NOT NULL,
`hist_geracao_dt_ativacao` VARCHAR(45) NULL,
`hist_metodo_de_download` VARCHAR(45) NULL,
`hist_licencas_qtde` VARCHAR(45) NULL,
`hist_ip` VARCHAR(45) NULL,
`hist_alias` VARCHAR(45) NULL,
`tbApp_app_cod` INT NOT NULL,
`cupomDesc_cupom_cod` INT NULL,
`mvx_serial_mvx_cod` INT NOT NULL,
`tbRevenda_id` INT(11) NOT NULL,
PRIMARY KEY (`hist_cod`),
INDEX `fk_historico_tbApp1_idx` (`tbApp_app_cod` ASC),
INDEX `fk_historico_cupomDesc1_idx` (`cupomDesc_cupom_cod` ASC),
INDEX `fk_historico_mvx_serial1_idx` (`mvx_serial_mvx_cod` ASC),
INDEX `fk_historico_tbRevenda1_idx` (`tbRevenda_id` ASC),
CONSTRAINT `fk_historico_tbApp1`
FOREIGN KEY (`tbApp_app_cod`)
REFERENCES `tbApp` (`app_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_historico_cupomDesc1`
FOREIGN KEY (`cupomDesc_cupom_cod`)
REFERENCES `cupomDesc` (`cupom_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_historico_mvx_serial1`
FOREIGN KEY (`mvx_serial_mvx_cod`)
REFERENCES `mvx_serial` (`mvx_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_historico_tbRevenda1`
FOREIGN KEY (`tbRevenda_id`)
REFERENCES `tbRevenda` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
The error seems to be on foreign key constraint
CREATE TABLE IF NOT EXISTS `tbApp_por_tbPais` (
...
CONSTRAINT `fk_tbApp_has_tbPais_tbPais1`
FOREIGN KEY (`tbPais_id`)
REFERENCES `tbPais` (`id`)
I do not see a table called tbPais.
AS the error essage, for this table tbApp_por_tbPais using foreign key ref tbPais.id,but you don't have the this table(tbPais).
CREATE TABLE IF NOT EXISTS `tbApp_por_tbPais` (
`tbApp_app_cod` INT NOT NULL,
`tbPais_id` INT(11) NOT NULL,
PRIMARY KEY (`tbApp_app_cod`, `tbPais_id`),
INDEX `fk_tbApp_has_tbPais_tbPais1_idx` (`tbPais_id` ASC),
INDEX `fk_tbApp_has_tbPais_tbApp1_idx` (`tbApp_app_cod` ASC),
CONSTRAINT `fk_tbApp_has_tbPais_tbApp1`
FOREIGN KEY (`tbApp_app_cod`)
REFERENCES `tbApp` (`app_cod`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tbApp_has_tbPais_tbPais1`
FOREIGN KEY (`tbPais_id`)
REFERENCES `tbPais` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
And lost table tbRevenda also.
CREATE TABLE IF NOT EXISTS `tbPais` (
`id` INT NOT NULL PRIMARY key
)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `tbRevenda` (
`id` INT(11) NOT NULL PRIMARY KEY
)
ENGINE = InnoDB;
Try to type in your database name before table name ...
CREATE TABLE IF NOT EXISTS `databasename.cambio` (