我有这个数据库结构
CREATE TABLE `productinfo` (
`ProductID` int(11) NOT NULL AUTO_INCREMENT,
`ProductName` varchar(255) NOT NULL,
`ProductImage` varchar(255) NOT NULL,
`CategoryID` int(11) NOT NULL,
`SubCategoryID` int(11) NOT NULL,
`ProductBrief` varchar(255) NOT NULL,
`Features` text NOT NULL,
`Specifications` text NOT NULL,
`Reviews` text NOT NULL,
`Price` varchar(255) NOT NULL,
`Status` tinyint(4) NOT NULL,
PRIMARY KEY (`ProductID`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
我现在需要将ProductID,CategoryID和SubCategoryID转换为Ps-5678这样的字符串作为部件号。 ProductID是主键,因此如何更改数据库的结构。 CategoryID和SubCategoryID是其他表中的主键,所以我如何处理这个...就像转动一样简单
`ProductID` int(11) NOT NULL AUTO_INCREMENT
成一个字符串......并摆脱
PRIMARY KEY (`ProductID`)
想法,建议任何人
答案 0 :(得分:8)
主键适用于数据库。
显示名称适用于最终用户。
不要混淆一个人!不要用有意义的东西制作主键。你迟早会后悔的。
将代理键/身份/自动编号作为主键是一个非常好的主意,并且在数据库设计中被广泛使用。
您可以添加列甚至是DERIVED COLUMN,并在其上添加唯一约束。
答案 1 :(得分:1)
我相信应该那么容易。 但是您需要确定要使用的字符串类型 http://dev.mysql.com/doc/refman/5.1/en/string-types.html
答案 2 :(得分:1)
您的要求不清楚。你怎么得到3个int列的“PS-5678”?您的示例中只有2个组件。
您是否只需要将3个INT转换为单个CHAR()字符串?
如果是这样,数据库很好,根本不需要更改表格!?!?!这三个组件已经可用,正确分离,作为不同的列。您正在寻找的只是将三个组件显示为单个字符串。
答案 3 :(得分:0)
我从您的问题中不清楚您对产品,类别和子类别所做的事情,以制作您的部件号。为了论证,我假设你将它们连接在一起,如产品123,类别456,子类别789给出部件号123-456-789或其他一些。
我喜欢在可行的情况下使用自然标识符作为主键。但“无论何时实际”都可能成为严重的制约因素。如果您的自然标识符是通过某种方式组合其他三个字段得出的,那么您有四种选择:
使主键成为这三个字段的组合。这往往是一种痛苦。然后,所有联接必须在三个字段上匹配,搜索必须测试三个字段等。
创建一个新字段,该字段是三个字段的串联,并将其用作priamry键。然后,只要其中一个“基本”字段发生更改,也会更改此连接字段。这是一个非常非常糟糕的主意。不要这样做。它是冗余数据,包含来自冗余数据的所有不良内容。
用一个组合字段替换三个单独的字段。这比#2更糟糕。现在,当您需要单独的值时,您必须将该字段分开。
放弃并创建合成密钥,如序列号。使用此作为主键,然后只使用自然键进行显示。如果我的自然键需要连接或以其他方式操纵三个字段,我倾向于使用此选项。